C++ 链接器问题:如何确定一个/DEFAULTLIB";是从哪里来的

C++ 链接器问题:如何确定一个/DEFAULTLIB";是从哪里来的,c++,visual-studio,linker,static-libraries,C++,Visual Studio,Linker,Static Libraries,我试图找到一种好方法来确定链接时哪个模块导致某个库被处理为“/DEFAULTLIB”,如VisualStudio的详细链接器输出所示 这里是我的情况,我有几个静态库的先决条件,每个先决条件都有一个发行版和一个调试版本(BlahD.lib和Blah.lib)。由于某些原因,在链接时,所有*D.lib都作为默认库处理,即使我正在构建一个将非调试lib指定为“附加依赖项”的版本。如果我从未构建静态库的调试版本,那么这些*D文件将不存在,并且会出现链接器错误(无法打开文件) 我可以通过为所有这些有问题的

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

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

我可以通过为所有这些有问题的.lib文件指定/NODEFAULTLIB来成功构建项目。所有的发布库都链接起来了,每个人都很高兴。但我想知道这里发生了什么。是什么导致链接器处理这些*D.lib文件?我唯一的希望是编写某种脚本,将这个大型项目及其相关项目()中的所有内容都转储到垃圾箱中吗?即使这样,我也不明白在dumpbin输出中查找什么,这是否适用于.lib文件以及.obj文件?

在源代码中查找。看看它是否依赖于一个
#define
-这是SDK确保链接正确lib的常用方法,您可能需要定义
THESDK\u DEBUG
THESDK\u RELEASE
,以实现逻辑

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

//cpp_quote("#pragma comment( lib, \"MYLIB.lib\")")

编译器仍然将MYLIB.lib添加为DEFAULTLIB,并最终保存在*.obj文件中。确保从代码中完全删除该行

我也有类似的问题。我只能按照您的建议,通过分析*.obj文件来解决这个问题。为此,我通过Visual Studio命令提示符运行了以下命令(在项目的temp文件夹中,其中生成了*.obj文件):

然后,我使用Notepad++在所有这些*.directions.txt文件中搜索有问题的库的名称。这揭示了哪个项目引用了错误的库

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


注意:您可能需要使用带有
/verbose
选项的*.o而不是*.obj

链接,并在输出中搜索相关库的名称。这将告诉您是哪个对象文件将库拖到链接中。

如果您所在的系统支持这些命令,则可以从命令行“查找”轻松搜索生成的文件-名称“*.directions.txt”| xargs grep我发现这个方法最有用,尽管我发现将所有输出指向同一个文件更容易,因为我在多个目录中有数百个对象文件。改为使用>>c:\directions.txt重定向。上述指令似乎以纯文本形式出现在obj和lib文件中。因此,无需调用dumpbin。对我来说,仅仅从命令行运行以下命令是有效的:
findstr/m/s/c:“/DEFAULTLIB:”mylib*.obj*.lib
for /R %1 in (*.obj) do @dumpbin /directives /section:.drectve "%1" > "%1".directives.txt