c++ - 让 CMake 定义应该使用哪个 VS 链接器而不指定路径
问题描述
概括
给出了以下场景:
- C++ 应用程序可以直接通过 Visual Studio 15 (2017) 构建,也可以使用脚本
cmake
直接调用。 - 我们遇到了奇怪的链接器问题,因为
cmake -G "Visual Studio 15 Win64"
指定了 - 进一步检查
CMakeCache.txt
表明,出于某种原因,仍然首先使用 32Bit 链接器:(CMAKE_LINKER:FILEPATH=D:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.15.26726/bin/Hostx86/x64/link.exe
注意Hostsx86
部分。这是 aHostsx64
应该在的地方) - 此外,
link.exe
Git 安装提供了一个不相关的(操作系统是 Win10)。link.exe
当 32Bit VS失败时,这个可执行文件显然是从路径中选择的 - 从 Visual Studio 构建时构建过程成功
所以基本上观察到的是:
Visual Studio 似乎在编译过程中使用 32Bit 链接器,尽管cmake -G "Visual Studio 15 Win64"
在生成项目文件时进行了设置。然后 32 位链接器耗尽堆空间,因此使用 64 位链接器重新尝试该过程。然而,要找到所述链接器,系统路径会被检查,并link.exe
首先找到 Git 安装提供的路径。此时,此链接器提供了源目录和参数,但由于它是不同的应用程序,因此构建过程会失败。
到目前为止,我只是猜测为什么 Visual Studio 能够成功编译和链接。目前的猜测是 Visual Studio 在检查路径之前检查了一些默认位置,因此link.exe
找到了正确的 64 位。这反过来又允许构建和链接过程成功完成。
尝试的解决方案
所以我检查了一些方法来解决这个问题:
- 检查
CMakeCache.txt
,使用的链接器设置在那里,它是 32 位版本:CMAKE_LINKER:FILEPATH=D:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.15.26726/bin/Hostx86/x64/link.exe
。在尝试编译和链接之前更改此设置。 - 检查环境变量,然后将正确的
link.exe
路径(ieD:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.15.26726/bin/Hostx64/x64/link.exe
)插入到 中Path
,以便在找到 Git 安装提供的路径之前找到它。这行得通。 - 尝试通过 CMake 使用
cmake -G "Visual Studio 15" -A x64 $src -B "build64" -T host=x64
. 这不起作用。
有效解决方案的问题在于,它们都需要设置正确链接器的显式路径,以便能够通过脚本进行编译。另外,它CMakeCache.txt
是在构建过程中生成的,所以设置到中途意味着整个构建过程无法执行。
问题
是否可以在通过调用执行构建管道之前配置 CMake cmake
,以便使用该位置的 64Bit 链接器D:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.15.26726/bin/Hostx86/x64/link.exe
而无需在某处明确设置此路径(例如,在调用期间通过 CMake 参数cmake -G
)?
否则,我们的贡献者必须应用个性化的解决方案并在他们的系统上单独设置这些路径。我正在尝试找到一个解决方案,其中我们的脚本调用cmake -G
以及cmake
之后的 -build 调用已经配置,以便从一开始就使用 64 位链接器并省略 32 位链接器。
另一个相关选项可能是 CMake 工具链文件:CMake:指定构建工具链
但是,这仍然需要手动设置路径。32Bit 链接器是自动找到的,是否没有办法在不提供显式路径的情况下自动设置 64Bit 链接器?
提前谢谢你,欢迎任何输入。
解决方案
推荐阅读
- python - Flask - CSS 源文件混淆
- shell - 在 shell 中每 100 个逗号后添加“换行符”
- azure-devops - Azure DevOps NuGet 任务刚开始失败(缺少 dotnet 核心)
- database - Firestore 数据结构从朋友和朋友的朋友那里获取项目
- python - 具有相似字符串部分保持索引和序列的两个数据帧的匹配序列
- java - 为每个检查的异常回滚的事务注释 - 使用 AspectJ
- notepad++ - 在 Powershell 中检查当前安装的 Notepad++ 版本
- r - 将两个数据集与一个共享列结合起来?
- reactjs - [React Webpack]:找不到模块:错误:无法解析 'C:\Users\....' 中的 'src/views/UserList'
- python - Graphene GraphiQL 在浏览器中不工作,但 Insomnia 客户端工作正常