Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用复合依赖项链接visual studio中的静态库_C++_Visual Studio_Linker_Static Libraries - Fatal编程技术网

C++ 使用复合依赖项链接visual studio中的静态库

C++ 使用复合依赖项链接visual studio中的静态库,c++,visual-studio,linker,static-libraries,C++,Visual Studio,Linker,Static Libraries,假设您有两个静态库A和B,这样A引用了B中的方法。是否可以将可执行文件静态链接到A和B,这样A引用的B中就没有未解析的符号 以下是我的情况: 当我在VisualStudio2010中尝试以这种方式链接所有内容时,A和B之间存在未解析的符号。。但不是在应用程序和A之间。它抱怨的符号具有_imp前缀(不存在,也不应该存在于B的DUMPBIN中)。为什么它要寻找带有_imp前缀的符号,即使没有一个lib是作为DLL构建的,而且我在所有项目中都包含了所有必需的“附加库依赖项/目录”?此外,所有内容都是使

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

以下是我的情况:

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

编辑:如果库B构建为带有导入库而不是静态库的DLL,则所有内容都将正确链接,这可能会有所帮助

编辑:我几乎可以肯定这不是导致declspec()或其他问题的预处理器条件,因为应用程序使用B时没有链接器错误。。就在A使用B的时候


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

依赖关系应该不重要!它们甚至可能是循环的,比如A refs B和B refs A。在我看来(因为你得到了链接器错误),要么你没有这些lib的头文件(你是手动声明B中A的func还是A中B的func),要么头文件在你的程序和libs中编译的方式不同(由于一些#define或compiler选项)。您在prog和libs中使用相同的调用约定吗?

因为您以前使用lib B作为DLL,所以当您构建lib a时,lib B可能仍然是DLL,而当您将lib更改为lib时,您忘记了重建a。

我没有MSVS 2010要查看,所以对此持保留态度

如果符号的名称中有imp,这意味着要么有一个declspec(dllimport)在某处浮动,要么有一个(可能嵌入在代码中)编译器开关迫使a将B视为DLL,要么是链接旧的内容,而不是构建过程当前生成的内容

您正在使用的项目是否从旧版本的MSV导入?我有一个类似的问题,一个管理不善的项目几年前被导入MSVS2008


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

我包含了所有的头,所有的方法都使用相同的调用约定,并且没有dllexport/dllimport。如果有的话,我会希望看到一个引用_imp符号,因为它实际上存在于B的符号表中。您可以尝试对文件进行预处理以查找有问题的库并搜索您的症状。这可能会直接指向问题所在。您的编辑意味着库A对B的使用与程序对B的使用不同。对文件进行预处理可以让您了解包含标题时的不同之处。+1到第二条评论,如果我按照您的建议进行预处理,我会节省很多时间:)@insipid:很高兴我能够帮助+1个好的建议,但自从将B改为静态后,我已经多次重建了a。好的,但是,您是否有一个附加的库路径到您的libs,或者您是否将libs复制到lib搜索路径中的某个位置并忘记了它。甚至这两种情况都存在,而且仍然存在一个最先发现的旧版本。