我想用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)
我试图强制编译器,但链接器问题将无法解决。
答案 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
(这完全等效,但输入量要少一些)。