CMake:使用自定义链接器

时间:2009-12-08 15:35:33

标签: gcc linker cmake

我想用qmake设置自定义工具链。我已经设置了编译器,但我不知道如何设置链接器。报告此错误是因为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)

我试图强制编译器,但链接器问题将无法解决。

8 个答案:

答案 0 :(得分:17)

链接命令行在Modules / CMake {C,CXX,Fortran} Information.cmake中设置,默认使用编译器,而不是CMAKE_LINKER(参见source code)。这可以通过替换构建链接命令行的规则来更改,该命令行位于变量CMAKE_CXX_LINK_EXECUTABLE(和朋友)中。注意,变量不指示链接器可执行文件的路径;它说如何链接可执行文件!

一种方法是将该规则设置为使用链接器,例如

cmake -DCMAKE_LINKER=/path/to/linker -DCMAKE_CXX_LINK_EXECUTABLE="<CMAKE_LINKER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>"

另请参阅this post from CMake mailing list - 这也是将链接器修饰符添加到另一个链接器的自然位置。

答案 1 :(得分:10)

我必须使用CMAKE_CXX_LINK_EXECUTABLE,CMAKE_C_LINK_EXECUTABLE变量:

SET(CMAKE_C_LINK_EXECUTABLE "c:\\MoSync\\bin\\pipe-tool.exe")

答案 2 :(得分:5)

在CMakeCache.txt或ccmake之后设置变量$ {CMAKE_LINKER}。在高级选项下。

答案 3 :(得分:2)

为完整性起见,另一种完全验证的选择是通过运行将/usr/bin/ld链接到ld.gold

sudo ln -sf /usr/bin/x86_64-linux-gnu-ld.gold /usr/bin/ld

根据建议here

答案 4 :(得分:2)

正如Mabraham指出的那样,CMake调用编译器进行链接。因此, 的最简单解决方案是放任它,而告诉编译器在调用时运行其他链接器。

正如this other answer中所述,但现在它甚至是gcc --help=common中已记录的选项,它很容易:

cmake -DCMAKE_CXX_FLAGS="-fuse-ld=lld"

g++clang++将在每次调用时传递-fuse-ld=lld标志,并且当它们进行任何链接时,它们将使用指定的命令而不是内置的默认命令。轻松自在,而CMake根本不需要关心这些事情。

答案 5 :(得分:2)

还有另一种方法,gcc 有一个 "-fuse-ld" 选项,你可以像这样在 CMakeLists.txt 中设置 LINKER_FLAGS:

set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld")

然后应该调用自定义指定的链接器。

答案 6 :(得分:0)

我成功了

add_link_options("-fuse-ld=lld")

这里是先前答案的变体。不同之处在于我用来设置标志的 CMake 命令。

将它添加到 CMAKE_CXX_FLAGS 的缺点是还必须添加 -Wno-unused-command-line-argument,因为标志也会添加到编译命令中,而不仅仅是链接命令。

CMAKE_SHARED_LINKER_FLAGS 的缺点是你必须多次添加到 _SHARED__EXE_ 中,可能我忘记了什么。

答案 7 :(得分:0)

CMake 只让您直接控制每种语言的编译器。要调用链接器,它会通过配置的编译器。这意味着在 CMake 中没有设置链接器的通用方法,您必须配置您的编译器以使用您想要的链接器。

此类标志需要在 CMake 的编译器检测例程运行之前设置,因为它会尝试编译测试二进制文件。最好的方法是创建一个 toolchain file。在工具链文件中设置这些标志的最佳方法如下:

# e.g. to use lld with Clang
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")

这三个变量分别控制可执行文件、可加载模块和共享库的(默认)链接器标志集。这里不需要处理 CMAKE_STATIC_LINKER_FLAGS_INIT(对于静态库),因为调用的是 archiver,而不是链接器。

然后,您可以在第一次运行 CMake 时通过在命令行设置 -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake 来设置工具链文件。从 CMake 3.21 开始,您将能够改为传递 --toolchain /path/to/toolchain.cmake(这完全等效,但输入量要少一些)。