为啥将库添加到链接器命令行两次?

Posted

技术标签:

【中文标题】为啥将库添加到链接器命令行两次?【英文标题】:Why are libraries added to linker command line twice?为什么将库添加到链接器命令行两次? 【发布时间】:2009-09-22 12:20:16 【问题描述】:

我有一个依赖于第 3 方静态库的 Visual C++ 2003 项目。我的 Visual c++ 项目也编译为静态库。我通过编辑项目属性,将第 3 方库的目录添加到附加库目录(例如 ./LibDir)并将库的名称添加到附加依赖项(例如 3rdParty.lib),从我的项目中引用了第 3 方库。

在我的机器上按预期工作,将其添加到链接器命令行:

/LIBPATH:"LibDir" 3rdParty.lib

在我同事的机器上,它将这个添加到链接器命令行:

/LIBPATH:"LibDir" 3rdParty.lib "LibDir\3rdParty.lib"

这会导致第 3 方库被链接两次,从而导致大量错误和警告。

此问题并非特定于该库 - 似乎我们尝试以这种方式在我同事的计算机上包含的任何第 3 方库最终都会被添加到命令行两次。

是什么导致他的机器和我的机器行为不同?

更新: 我现在已经在第三台机器上对此进行了测试,它表现出与我同事的机器相同的行为,即引用一个额外的依赖项会导致它被添加到链接器命令行两次(当我打开完全相同的项目文件时会发生这种差异每台机器)。

我能想到的我的机器和其他两台机器之间的唯一区别是几年前我在我的机器上安装了 VC++ 2003,本周又在另外两台机器上安装了 VC++ 2003。

此外,似乎只有在我的项目被编译为库时才会发生这种情况 - 如果它被编译为 exe,则第 3 方库只会被添加到链接器命令行一次。

有什么想法吗...?

【问题讨论】:

【参考方案1】:

检查您的朋友项目的附加目录中是否有任何不必要的依赖继承。

尝试排除您的 3rdParty.lib, 检查属性中是否有任何 $(ProjDir) 或任何类似的附加差异。

您能否从编译器/链接器发布您的命令行(这可以在属性中找到)。

【讨论】:

我查看了我 PC 上的命令行选项,将文件复制到他的 PC 并查看了相同的选项: 我们的编译器命令行选项相同: /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_MBCS" /FD /EHsc /MD /GS /Fo"Release/" /Fd"Release/vc70.pdb" /W3 /nologo /c /Wp64 /Zi /TP 我的链接器行:/ OUT:"../release/lib/zipper.lib" /LIBPATH:"zlib" /NOLOGO zlibstat.lib 他的链接器行:/OUT:"../release/lib/zipper.lib" /LIBPATH:"zlib" /NOLOGO zlibstat.lib ".\zlib\zlibstat.lib"【参考方案2】:

我遇到了同样的问题,并将包含的库移动到一个没有任何空格的目录结构中。那时它工作得很好。

【讨论】:

以上是关于为啥将库添加到链接器命令行两次?的主要内容,如果未能解决你的问题,请参考以下文章

当我仅使用链接器选项 /LTCG 时,为啥 Visual Studio 会在链接器命令行中显示选项 /PGD?

为啥我的 C++ 代码中出现链接器命令失败错误? [复制]

如何使用命令行将“其他链接器标志”添加到 xcode 项目?

链接过程

将 opencv 库添加到 QT 创建者并出现错误:链接器命令失败,退出代码为 1

在链接时间内在特定部分添加变量