是否可以在调用链接器时强制 CMake 重新排序参数?

Is it possible to force CMake to reorder arguments when calling the linker?

本文关键字:新排序 排序 参数 CMake 调用 链接 是否      更新时间:2023-10-16

我有一个奇怪的行为,如果需要动态链接,CMake 无法链接任何可执行文件。 G++ 无法找到库中定义的任何符号。

我发现这可能与链接时 CMake 传递给 g++ 的参数顺序有关。

下面是构建过程的详细输出(链接失败(:

[ 50%] Building CXX object CMakeFiles/chargen.dir/test.cpp.obj
g++ -std=c++11   -o CMakeFiles/test.dir/test.cpp.obj -c /f/test/test.cpp
[100%] Linking CXX executable mytest
/usr/bin/cmake -E cmake_link_script CMakeFiles/test.dir/link.txt --verbose=1
g++   -std=c++11   -lSDL2 CMakeFiles/test.dir/test.cpp.obj  -o mytest

事实上,如果我尝试使用该命令进行链接,我会得到未定义的引用,但是如果我在最后使用库标志进行编译:

g++   -std=c++11 CMakeFiles/test.dir/test.cpp.obj  -o mytest -lSDL2 

它运行良好。如何强制 CMake 改用该参数顺序?

CMakeLists的内容.txt:

cmake_minimum_required(VERSION 3.6)
project(mytest)
set(COMPILER_PATH "/usr/bin/")
set(CMAKE_MAKE_PROGRAM "make")
set(CMAKE_C_COMPILER   "gcc")
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lSDL2")
set(SOURCE_FILES test.cpp)
add_executable(mytest ${SOURCE_FILES})

您可能已将-lSDL2添加到CMAKE_CXX_FLAGS中。在这种情况下,它将在实际链接命令的源文件名前面显示编译/链接标志,如您所显示的。别这样。

您应该使用 cmake 命令_target_link_libraries_以定义要链接的库。简而言之,CMakeLists.txt的骨架应如下所示:

project (project_name)
add_executable (mytest test.cpp)
target_link_libraries( mytest SDL2)

在这种情况下,cmake 会将库放在正确的位置。请注意,您可以在添加目标 mytest 后使用 target_link_libraries

[编辑]

看到您的CMakeList后,很明显您的问题CMAKE_EXE_LINKER_FLAGS错误。只需删除要设置的行,然后在add_executable后添加target_link_libraries。

关于你关于处理静态库之间的循环依赖的问题,你以 sam 的方式处理它,就像你不使用 cmake 一样:提到两次:

target_link_libraries( 
mytest 
circular_dep1
circular_dep2
circular_dep1
circular_dep2
)

关于您关于特定链接器标志的问题,只需将它们放入target_link_libraries命令中,它也接受链接器标志。您可以在以下链接中找到文档:

https://cmake.org/cmake/help/latest/command/target_link_libraries.html