在CMake中,为什么可以设置编译器而不设置链接器?

问题描述 投票:0回答:1

我正在学习CMake。在我的各种阅读过程中,我有时会遇到显式设置 C/C++ 编译器的指令,例如通过将

-D CMAKE_CXX_COMPILER "/path/to/compiler"
参数传递给
cmake
,或 CMakeLists.txt 中的
set(CMAKE_CXX_COMPILER "/path/to/compiler")
语句或
"cacheVariables": {"CMAKE_CXX_COMPILER": "/path/to/compiler"}
中的
CMakePresets.json
行。 (一个例子是这篇文章,但显然有很多类似的问答/教程具有类似的指导)。我想到的一个用例是在 Windows 上,我相信 Visual Studio 默认安装
cl.exe
并为您提供额外安装
clang-cl.exe
的选项。

但是您对编译器的选择是否也会影响您对其他工具链实用程序的选择,例如链接器,也许是归档器等?为什么只设置

CMAKE_CXX_COMPILER
就足够了,而不设置一些控制链接器的相应变量,例如
CMAKE_LINKER

我的意思是:我知道有 CMake 缓存变量来控制编译器和链接器的选择,但是 广义上讲,在线教程、文章、Stack Overflow 帖子等都讨论了设置

CMAKE_CXX_COMPILER
也不手拉手讨论设置
CMAKE_LINKER
。例如。如果我明确地执行
set(CMAKE_CXX_COMPILER "gcc")
,为什么我不需要也明确地执行
set(CMAKE_LINKER "ld")

有人可以解释一下 CMake 上下文中编译器和链接器(以及其他相关工具链实用程序)之间的关系吗?为什么只设置

CMAKE_CXX_COMPILER
就足够了,而不设置一些控制链接器的相应变量,例如
CMAKE_LINKER


(我脑子里有一个不完全形成的概念,像

gcc
和大概
cl.exe
这样的“编译器”实际上是“编译器驱动程序”,这意味着它们实际上包装/封装了实际进行编译的其他可执行文件和链接(和存档?)——这是正确的,并且与问题相关吗?)

c++ cmake linker compiler-construction
1个回答
0
投票

通过了解编译器,在大多数情况下,CMake 能够猜测编译、链接和其他一些过程所需的其他实用程序的位置。

猜测是根据编译器的路径和信息执行的,编译器能够报告其自身(例如,参见变量CMAKE__COMPILER_ID的描述)。至于链接过程,默认情况下 CMake 使用编译器本身来驱动链接:https://stackoverflow.com/a/25274328/3440745.

在极少数情况下,当 CMake 无法猜测工具链的其他部分时,需要另外设置其他变量(通常在工具链文件中完成)。

© www.soinside.com 2019 - 2024. All rights reserved.