首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用链接器时,可以强制CMake重新排序参数吗?

问在调用链接器时,可以强制CMake重新排序参数吗?
EN

Stack Overflow用户
提问于 2018-09-02 19:52:03
回答 1查看 1.2K关注 0票数 3

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

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

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

代码语言:javascript
复制
[ 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

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

代码语言:javascript
复制
g++   -std=c++11 CMakeFiles/test.dir/test.cpp.obj  -o mytest -lSDL2 

它运行得很好。我怎样才能强迫CMake使用这种参数顺序呢?

CMakeLists.txt的内容:

代码语言:javascript
复制
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})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-02 20:25:47

您可能已经将-lSDL2添加到CMAKE_CXX_FLAGS中。在这种情况下,它将出现在实际链接命令中的源文件名前面,并带有n个编译/链接标志,如您所示。别干那事。

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

代码语言:javascript
复制
project (project_name)

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

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

编辑

在看到您的CMakeLists之后,很明显您的问题出现在错误的CMAKE_EXE_LINKER_FLAGS中。只需删除设置它的行,并在target_link_libraries之后添加add_executable。

关于如何处理静态库之间的循环依赖关系的问题,您可以像不使用cmake那样以sam的方式处理它:请两次提到它:

代码语言:javascript
复制
target_link_libraries( 
    mytest 
    circular_dep1
    circular_dep2
    circular_dep1
    circular_dep2
)

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

libraries.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52140533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档