我正在尝试找到一种好方法来确定链接时哪个模块导致某个库被处理为“/DEFAULTLIB”,如 Visual Studio 的详细链接器输出所示。
这是我的情况,我有几个静态库先决条件,每个都有一个发布版本和一个调试版本(BlahD.lib 和 Blah.lib)。由于某种原因,在链接时,所有 *D.lib 都作为默认库处理,即使我正在构建一个带有指定为“附加依赖项”的非调试库的版本。如果我从不构建静态库的调试版本,那么这些 *D 文件将不存在,并且会出现链接器错误(无法打开文件)。
我可以通过为所有这些有问题的 .lib 文件指定/NODEFAULTLIB 来成功构建我的项目。所有的发布库链接起来,每个人都很高兴。但我想了解这里发生了什么。是什么导致链接器处理这些 *D.lib 文件?我唯一的希望是编写某种脚本来转储这个庞大项目及其依赖项目(microsoft support)中的所有内容吗?即使这样,我也不明白要在 dumpbin 输出中查找什么,这是否适用于 .lib 文件以及 .obj 文件?
最佳答案
我遇到了类似的问题。我只能按照您的建议通过分析 *.obj 文件来解决它。为此,我通过 Visual Studio 命令提示符运行以下命令(在项目的临时文件夹中,其中生成 *.obj 文件):
for /R %1 in (*.obj) do @dumpbin /directives /section:.drectve "%1" > "%1".directives.txt
然后我使用 Notepad++ 在所有这些 *.directives.txt 文件中搜索有问题的库的名称。这揭示了哪个项目引用了错误的库。
注意:您可能需要修改它以包含您的项目可能使用的任何第 3 方 *.lib 文件,而不仅仅是 *.obj 文件。 “/DEFAULTLIB”指令也可能来自它们。
注意:您可能需要使用 *.o 而不是 *.obj
关于c++ - 链接器故障 : How to determine where a "/DEFAULTLIB" is coming from,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5249431/