是否可以在调用链接器时强制 CMake 重新排序参数?
Is it possible to force CMake to reorder arguments when calling the linker?
我有一个奇怪的行为,如果需要动态链接,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
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 数组将排序排序为降序而不是升序
- 如何按姓氏排序并打印新数组
- 将一个数组的每个元素乘以另一个数组的每个元素,并对新的非常大的数组进行排序
- 合并排序 - 返回新数组,而不是将合并的数组复制到输入数组
- 如何对骰子进行排序并创建每个数组中具有相等骰子的新数组,Yahtzee,C++
- 与排序相关的算法(将每个项目替换为排序排序中的索引)
- 如何将未排序数组的排序索引放入新数组中
- "std::"具有排序/排序、存在测试和头/尾访问的数据结构?
- 创建没有重复项的新排序向量
- 使用快速排序排序不会给出排序的数组
- 读取文本行,对它们进行排序并将它们写入新的文本文件