我正在尝试找到一种很好的方法来确定链接时哪个模块导致某个库被处理为“/ DEFAULTLIB”,如Visual Studio的详细链接器输出中所示。
这是我的情况,我有几个静态库先决条件,每个都有一个发行版和一个调试版(BlahD.lib和Blah.lib)。由于某种原因,在链接时,所有* D.lib都被处理为默认库,即使我正在构建一个版本,其中非调试库被指定为“附加依赖项”。如果我从不构建静态库的调试版本那些* D文件将不存在,并且会出现链接器错误(无法打开文件)。
我可以通过为所有这些违规的.lib文件指定/ NODEFAULTLIB来成功构建我的项目。所有发布库都链接起来,每个人都很高兴。但我想了解这里发生了什么。是什么导致链接器处理这些* D.lib文件?我唯一的希望是编写某种脚本,在这个庞大的项目及其依赖项目(microsoft support)中抛弃所有东西?即使这样我也不明白在dumpbin输出中要查找什么,这是否适用于.lib文件以及.obj文件?
答案 0 :(得分:10)
我有类似的问题。我只能通过分析你建议的* .obj文件来解决它。为此,我通过Visual Studio命令提示符运行以下命令(在项目的temp文件夹中,生成* .obj文件):
for /R %1 in (*.obj) do @dumpbin /directives /section:.drectve "%1" > "%1".directives.txt
然后我使用Notepad ++在所有这些* .directives.txt文件中搜索违规库的名称。这揭示了哪个项目引用了错误的lib。
注意:您可能希望修改此项以包含项目可能使用的任何第三方* .lib文件,而不仅仅是* .obj文件。 “/ DEFAULTLIB”指令也可能来自它们。
注意:您可能需要使用* .o而不是* .obj
答案 1 :(得分:6)
在源代码中查找#pragma comment(lib)。看看它是否依赖于#define
- 这是SDK确保链接正确库的常用方法,您可能需要为THESDK_DEBUG
或THESDK_RELEASE
定义解决问题的逻辑。
其他信息: 我在Visual Studio 2008中发现甚至评论* .idl文件中的语句不起作用,如:
//cpp_quote("#pragma comment( lib, \"MYLIB.lib\")")
编译器仍将MYLIB.lib添加为DEFAULTLIB,它会在* .obj文件中结束。确保从代码中完全删除该行!
答案 2 :(得分:0)
与/verbose
选项链接,并在输出中搜索相关库的名称。这将告诉您哪个目标文件将库拖入链接。