链接器故障:如何确定"/ DEFAULTLIB"的来源

ins*_*pid 15 c++ linker static-libraries visual-studio

我试图找到一种很好的方法来确定链接时的哪个模块导致某个库被处理为"/ DEFAULTLIB",如Visual Studio的详细链接器输出中所示.

这是我的情况,我有几个静态库先决条件,每个都有一个发布和一个调试版本(BlahD.lib和Blah.lib).由于某种原因,在链接时,所有*D.lib都被处理为默认库,即使我正在构建一个版本,其中非调试库被指定为"附加依赖项".如果我从不构建静态库的调试版本那些*D文件将不存在,并且会出现链接器错误(无法打开文件).

通过为所有这些违规的.lib文件指定/ NODEFAULTLIB,我可以成功构建我的项目.所有发布库都链接起来,每个人都很高兴.但我想了解这里发生了什么.是什么导致链接器处理这些*D.lib文件?我唯一的希望是编写某种脚本,在这个庞大的项目及其依赖项目(微软支持)中抛弃一切?即使这样我也不明白在dumpbin输出中要查找什么,这是否适用于.lib文件以及.obj文件?

Yod*_*ber 12

我遇到了类似的问题.我只能通过分析你建议的*.obj文件来解决它.为此,我通过Visual Studio命令提示符运行以下命令(在项目的temp文件夹中,生成*.obj文件):

for /R %1 in (*.obj) do @dumpbin /directives /section:.drectve "%1" > "%1".directives.txt
Run Code Online (Sandbox Code Playgroud)

然后我使用Notepad ++在所有这些*.directives.txt文件中搜索违规库的名称.这揭示了哪个项目引用了错误的lib.

注意:您可能希望修改此项以包含项目可能使用的任何第三方*.lib文件,而不仅仅是*.obj文件."/ DEFAULTLIB"指令也可能来自它们.

注意:您可能需要使用*.o而不是*.obj


Eri*_*rik 8

在源代码中查找#pragma comment(lib).看看它是否可能依赖于#define- 这是SDK确保链接正确库的常用方法,您可能需要定义逻辑THESDK_DEBUGTHESDK_RELEASE使用逻辑.

其他信息:我在Visual Studio 2008中发现甚至注释掉*.idl文件的语句也不起作用,如:

//cpp_quote("#pragma comment( lib, \"MYLIB.lib\")")
Run Code Online (Sandbox Code Playgroud)

编译器仍将MYLIB.lib添加为DEFAULTLIB,它会在*.obj文件中结束.确保从代码中完全删除该行!