c++ - 链接器如何选择要包含以构建的 .lib 文件?

标签 c++ visual-studio-2010 dependencies cgal

一些不太有意义的背景:我正在尝试使用 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/

相关文章:

c++ - 人们需要什么来运行我的应用程序?

c++ - SDL2修改像素

c++ - CMake:构建库并将其链接到可执行文件导致 undefined reference 错误

c# - 当 DataSet 表 1 为空时,Crystal Report 不显示数据

android - Instant run 不适用于 Android Studio,表示需要 Gradle 版本 2.10。我用2.10

c - 相互依赖的TCL扩展

c++ - 按基类将派生对象存储在 vector 中,并在删除时将它们返回给派生对象

sql - Visual Studio 2010 数据库版本架构比较,其中目标是 dbproj

c# - 使用 CMS 进行 ASP.NET MVC 项目的最佳方法是什么

c# - 处理对频繁更改的 DLL 的依赖