我想用CMake设置一个自定义工具链。我已经设置了编译器,但我不知道如何设置链接器。报告此错误是因为CMake尝试使用编译器链接:
The C compiler "xgcc.exe" is not able to compile a simple test program.
这里有一个我的工具链文件的片段
# specify the cross compiler
INCLUDE(CMakeForceCompiler)
SET(CMAKE_C_COMPILER xgcc.exe)
SET(CMAKE_CXX_COMPILER xgcc.exe)
#CMAKE_FORCE_C_COMPILER(xgcc.exe GNU)
#CMAKE_FORCE_CXX_COMPILER(xgcc.exe GNU)
我已经尝试强制编译器,但链接器的问题不会得到解决。
9条答案
按热度按时间wwwo4jvm1#
link命令行在Modules/CMake{C,CXX,Fortran}Information.cmake中设置,默认使用 compiler,而不是
CMAKE_LINKER
(参见源代码)。这可以通过替换构建link命令行的规则来更改,该规则存在于变量CMAKE_CXX_LINK_EXECUTABLE
(和朋友)中。注意,该变量不指示指向链接器可执行文件的路径;它说如何链接可执行文件!一种方法是设置该规则以使用链接器,例如
参见this post from CMake mailing list和this one--这也是一个自然的地方,可以在另一个连接器前添加一个连接器修饰符。
pgvzfuti2#
正如Mabraham指出的,CMake调用编译器来做链接。所以,* 到目前为止***最简单的解决方案是LET IT,并在调用时告诉 * 编译器 * 运行不同的链接器。
正如在this other answer中所指出的-但现在它甚至是
gcc --help=common
中的文档选项-就像下面一样简单:g++
或clang++
将在每次调用时传递-fuse-ld=lld
1标志,当它们进行任何链接时,它们将使用指定的命令而不是内置的默认命令。(BTW,该选项被解析为(
-f
)(use-ld
)(=
)(lld
),没有到gcc
的“fuse”选项。)注意事项
1.当使用Clang时,
lld
可以替换为您想要使用的任何其他链接器命令,如ld.exe
,ld.gold
,mingw32/bin/ld.exe
等。GCC没有那么灵活,它的
-fuse-ld
只接受有限的一组可能的参数。(它们在gcc --help=common
输出中列出,从GCC 12.2.1开始,列表是:bfd
、gold
、lld
或mold
。)它将调用在PATH
上找到的第一个匹配的ld.*foo*
可执行文件。(感谢bviktor指出GCC在选择替代链接器方面的限制。)vuv7lop33#
CMake只给你直接控制每种语言的编译器。要调用链接器,它需要经过配置的编译器。这意味着在CMake中没有通用的方法来设置链接器,你必须配置你的编译器来使用你想要的链接器。
这些标志需要在CMake的编译器检测例程运行之前设置,因为它会尝试编译一个测试二进制文件。最好的方法是创建一个toolchain file。在工具链文件中设置这些标志的最佳方法如下:
这三个变量分别控制可执行程序、可加载模块和共享库的链接器标志(默认)集。这里不需要处理
CMAKE_STATIC_LINKER_FLAGS_INIT
(对于静态库),因为调用的是 archiver,而不是链接器。然后,您可以在 * 第一次 * 运行CMake时通过在命令行设置
-DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake
来设置工具链文件。从CMake 3.21开始,您将能够传递--toolchain /path/to/toolchain.cmake
(这是完全等效的,但输入较少)。xn1cxnb44#
我成功地做了
这是前面答案的一个变体,不同之处在于我用来设置标志的CMake命令。
将其添加到
CMAKE_CXX_FLAGS
的缺点是,还必须添加-Wno-unused-command-line-argument
,因为标志也会添加到编译命令中,而不仅仅是链接命令。CMAKE_SHARED_LINKER_FLAGS
的缺点是你必须多次添加它,到_SHARED_
,_EXE_
,也许我忘了什么。hgtggwj05#
在CMakeCache.txt中或在高级选项下的ccmake .之后设置变量${CMAKE_LINKER}。
ujv3wf0j6#
我必须使用CMAKE_CXX_LINK_EXECUTABLE,CMAKE_C_LINK_EXECUTABLE变量:
cqoc49vn7#
下面是一个CMake函数,它根据一些预定义的任意规则(Clang -〉lld-version或lld,GCC -〉gold)设置链接器。
重要部件:
1.搜索与Clang编译器版本匹配的
lld-version
(如果使用Clang 13.x.x,则为lld-13),如果未找到,福尔斯到lld
1.当链接器设置为
gold
时,使用所有系统线程:由于注解、日志和自定义逻辑,该示例有点太长,但它是自包含的,对于初学者来说可能是有用的起点。
测试日期:
j13ufse28#
为了完整起见,另一个完全证明的选项是通过运行以下命令将
/usr/bin/ld
链接到ld.goldsudo ln -sf /usr/bin/x86_64-linux-gnu-ld.gold /usr/bin/ld
如建议here
gblwokeq9#
还有另一种方法,gcc有一个“-fuse-ld”选项,你可以在CMakeLists.txt中设置LINKER_FLAGS如下:
则应调用定制指定的链接器。