一些不太有意义的背景:我正在尝试使用 Visual Studio 2010 构建 CGAL。它依赖于 GMP 和 MPFR 库。我正在构建依赖于 CGAL 的项目。
在构建我的项目时,出现链接器错误:
error LNK1104: cannot open file 'gmp-vc100-mt-sgd.lib'
但是,我告诉 CGAL 在文件 gmp.lib 中使用 GMP。而且确实被使用了。但不知何故,链接器还需要 gmp-vc100-mt-sgd.lib。因此,“gmp-vc100-mt-sgd.lib”是默认名称,我通过更改一些 CGAL 配置 .h 文件将其更改为“gmp.lib”。我检查了所有可能的地方:
- Linker->Additional Dependencies in my project中没有这样的lib
- 我的项目没有对这个库的引用
- 以上适用于我解决方案中的所有项目
- 在任何包含的 .h 文件中都没有
#pragma comment(lib, "gmp-vc100-mt-sgd.lib")
指令(我已经为所有文件生成了 .i 预处理器输出在我的项目中)
我尝试重建 CGAL 并重建我的解决方案,但没有结果——链接器仍然需要旧的“gmp-vc100-mt-sgd.lib”文件。
我卡住了。还有其他选项可以检查吗?其他 .lib 依赖项来自其他来源吗? gmp-vc100-mt-sgd.lib 的唯一提及是在/DEFAULTLIB: 指令下的 CGAL .lib 和 .obj 文件中。我搜索了 CGAL 解决方案中的所有文件,没有找到提到这个神奇的 gmp-vc100-mt-sgd.lib 名称的地方。
我检查了 .i 文件中的每个 #pragma 指令,以确保名称 gmp-vc100-mt-sgd.lib 没有被分成几部分,所以我找不到它。它绝对不会出现在那里。
有什么想法吗?
最佳答案
好的,我想通了。问题确实出在我在 CGAL.lib 文件中发现的/DEFAULTLIB 中。
事实证明,当 Visual Studio 正在构建 .lib 文件并遇到 #pragma comment
指令时,它会留下一些如何链接该库的说明。据我了解,它只是告诉链接器使用 /DEFAULTLIB链接时的选项。然后链接器尝试将这个库添加到搜索列表中,即使它没有未解析的外部。
所以我在构建我的项目时试图删除 #pragma comment
指令,但我应该在构建 CGAL 项目本身时尝试删除它。后者工作正常。
关于c++ - 链接器如何选择要包含以构建的 .lib 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9434522/