将Visual Studio中的静态库与复合依赖链接起来

问题描述:

假设您有两个静态库A和B,使得A引用了B的方法。是否可以将可执行文件静态链接到A和B,使得B中没有未解析的符号由A引用?将Visual Studio中的静态库与复合依赖链接起来

这里是我的情况:

当我尝试一切连接起来,在Visual Studio 2010中那样,有A和B之间悬而未决的符号..但不是应用程序和A.它抱怨的符号之间有__imp前缀(不应该存在于B的DUMPBIN中)。为什么它会寻找带有__imp前缀的符号,即使没有任何库被构建为DLL,并且我在所有项目中都包含了所有必需的“附加库依赖项/目录”?而且,一切都是用完全相同的编译器构建的。

编辑:它可能会有帮助,知道如果库B作为一个DLL导入库而不是静态库生成,一切都会正确连接。

编辑:我几乎可以肯定它是不是造成declspec()或东西预处理条件,因为没有链接错误,当应用程序采用B ..只是当A使用B.

答:这两个Edwin和JimR是正确的,实际上有一个宏用于引起declspec的头文件中,但是当他们第一次提到这种可能性时,我太固执了。谢谢你们的耐心。

这些依赖关系应该不重要!他们甚至可能是循环的,如A参考B和B参考答案。这听起来对我来说(因为你得到链接器错误),要么你没有这些库的头文件(你是否用手或funcs从A中声明A的funcs来自A中的B),或者头文件在你的程序和lib库中编译的方式不同(由于某些#define或编译器选项)。你在prog和libs中使用相同的调用约定吗?

+0

我有所有的头文件,所有的方法都使用相同的调用约定,并且没有dllexport/dllimport正在进行。如果有的话,我会希望看到A引用__imp符号,因为它实际上存在于B的符号表中。 – insipid 2010-11-24 16:55:30

+1

您可以尝试对文件进行预处理以查找问题库并搜索您的症状。这可能会直接指出您的问题。 – 2010-11-24 17:03:25

由于您使用的lib B,为DLL之前是有可能,当你建立一个LIB你的lib B为仍然是一个DLL,当你改变的lib图书馆你忘了重建A.

我没有2010年MSVS看,所以采取这一粒盐。

如果符号小鬼的名字,这意味着要么有漂浮的地方,(可能嵌入代码)编译器开关强制到见B作为一个DLL或者你是一个declspec(dllimport的)链接旧的东西,而不是构建过程中正在生成的东西。

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

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