几年前,我发现了一个黑客,它允许您强制Visual C++以特定的优先级链接库。这不是优雅的,但它是功能性的。
似乎Visual C++的链接器基于符号依赖关系即时生成链接顺序。通过预先添加符号引用,您可以强制链接器包含链接器输入中指定的第一个库。 请注意,我只用Visual C++ 6和8(2005)进行了测试。
比方说,例如,你有两个库与符号XML_ParserCreate:
- libexpat.lib - XML_ParserCreate
- someother.lib - OtherSymbolsYouNeed,XML_ParserCreate
首先,为了您的库如你所期望的依赖关系,libexpat.lib然后someother.lib。通过命令行,这些将是link.exe
的选项。在Visual Studio 2005中,它们将是项目配置属性 - >链接器 - >输入 - >其他依赖关系下的选项。我会想象Visual C++ 2010有一个类似的菜单。
接下来,使用/INCLUDE链接器选项,添加一个命令行选项,用于定义一个已知的重复符号。>链接 - - 在Visual Studio 2005中,这可以在该项目的配置属性添加>命令行 - >附加选项:
/out some.exe ... libexpat.lib someother.lib
/include:XML_ParserCreate
这个符号的定义将导致链接立即喜欢的第一个库终止(实现)它。一般情况下,Visual C++会产生重复符号的错误;如果您还没有,请确保您还指定了/FORCE:MULTIPLE链接器选项。
我的具体需求是使用DUMA内存调试库。它定义了libcmtd.lib中定义的各种内存函数。下面会错误地链接_malloc的libcmtd的版本,尽管这似乎与此相反库顺序:
/out some.exe ... duma.lib libcmtd.lib
/FORCE:MULTIPLE
这是通过手动添加符号解决,并可靠地工作了多年:
/out some.exe ... duma.lib libcmtd.lib
/INCLUDE:_malloc /FORCE:MULTIPLE
我想过创建一个DLL,但由于'其他'库是硬件加密狗保护库,我不想这么做:-) – 2010-05-04 13:17:36