将visual studio中的静态库与复合依赖关系链接起来

时间:2010-11-24 16:10:25

标签: c++ visual-studio linker static-libraries

假设您有两个静态库A和B,以便A引用B中的方法。是否可以将可执行文件静态链接到A和B,以便A引用的B中没有未解析的符号?

以下是我的情况:

当我尝试在Visual Studio 2010中以这种方式链接所有内容时,A和B之间存在未解析的符号..但是在应用程序和A之间没有。它所抱怨的符号具有__imp前缀(不是,并且不应该存在于B的DUMPBIN中。为什么它会查找带有__imp前缀的符号,即使没有任何lib构建为DLL,并且我已在所有项目中包含了所有必需的“附加库依赖项/目录”?此外,所有内容都使用完全相同的编译器构建。

编辑:知道如果库B被构建为带有导入库而不是静态库的DLL可能会有所帮助,一切都会正确链接。

编辑:我几乎可以肯定它不是导致declspec()或其他东西的预处理器条件,因为当App使用B时没有链接器错误......就在A使用B时。

答案:Edwin和JimR都是正确的,实际上在标题中使用了一个宏来导致declspec,但是当他们第一次提到这种可能性时,我太顽固了。谢谢你的耐心。

3 个答案:

答案 0 :(得分:3)

家属应该无所谓!它们甚至可能是循环的,比如A引用B和B引用A.听起来对我(因为你得到链接器错误)要么你没有那些libs的头文件(你是用手或者funcs声明来自B中的A的funcs)来自A中的B或者头文件在程序和libs中的编译方式不同(由于某些#define或编译器选项)。你在prog和libs中使用相同的调用约定吗?

答案 1 :(得分:3)

我没有看过MSVS 2010,所以请耐心等待。

如果符号中的符号 imp ,则意味着在某处浮动一个declspec(dllimport),一个(可能嵌入代码中)编译器开关强制A将B视为DLL或者你正在链接旧的东西而不是构建过程当前正在生成的东西。

您使用的项目是从较早版本的MSVS导入的吗?我有一个类似的问题,几年前导入MSVS 2008的管理不善的项目......

无论哪种方式,请仔细检查A的构建环境,并确保查找嵌入编译器/链接器开关的编译指示。

答案 2 :(得分:1)

由于您之前使用的lib B作为DLL,因此在构建lib时可能是您的lib B仍然是DLL,当您将lib更改为库时,您忘记重建A。