如何在cmake文件中更改Libs的顺序?

时间:2013-08-01 19:25:59

标签: gcc linker cmake pkg-config

链接订单很重要。当我用以下代码编译程序时,我观察到了

gcc `pkg-config --cflags --libs gtk+-2.0` program.cpp -o program

会产生许多链接器错误:“未定义引用`_gtk_init_abi_check'”等。这可以通过在库之前指定输入文件来解决。

gcc program.cpp `pkg-config --cflags --libs gtk+-2.0` -o program

我的问题:

当我使用Cmake文件时,如何解决这种性质的问题?以下是我目前正在使用的简单cmake文件的内容。

cmake_minimum_required(VERSION 2.6)

project(program)

add_executable(program
program.cpp
)

EXEC_PROGRAM(pkg-config ARGS --cflags --libs gtk+-2.0 
             OUTPUT_VARIABLE GTK2_PKG_FLAGS)
SET(GTK2_PKG_FLAGS CACHE STRING "GTK2 Flags" "${GTK2_PKG_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GTK2_PKG_FLAGS}")

现在,当我执行cmake后跟make时,我得到了上面第一行给出的相同链接器错误,所以我知道我的链接器问题与订单严格相关。那么在cmake文件中使用pkg-config时如何更改链接顺序?我已经尝试重新排序我的cmake文件的一部分,但我似乎没有找到正确的顺序。

2 个答案:

答案 0 :(得分:4)

您已在命令中传递了--cflags--libs两个参数,它们将.pc文件的-I和-L部分都放在一个变量中。

尝试运行message("${GTK2_PKG_FLAGS}")来打印内容。

因此,使用target_link_libraries()链接整个变量$ GTK2_PKG_FLAGS可能并不谨慎。

您可能还想尝试以下步骤

    INCLUDE(FindPkgConfig)
    pkg_check_modules(GTK REQUIRED gtk+-2.0)  

#include  
    include_directories(${GTK_INCLUDE_DIRS})  

#link  
    link_directories(${GTK_LIBRARY_DIRS})  
    target_link_libraries(program ${GTK_LIBRARIES}) 

参考question

答案 1 :(得分:1)

啊哈!经过大量搜索和一些试验和错误后,我终于通过将以下行添加到我的cmake文件CMakeLists.txt来实现它:

target_link_libraries(program
${GTK2_PKG_FLAGS}
)

通过使用user2618142的一些建议,我改进了它。由于某种原因,函数pkg_check_modules()对我不起作用。我得到Unknown CMake command "pkg_check_modules"但是通过使用以下作为我的cmake文件,事情按预期工作。

cmake_minimum_required(VERSION 2.6)

project(program)

exec_program(pkg-config ARGS --cflags gtk+-2.0 OUTPUT_VARIABLE GTK_FLAGS)
exec_program(pkg-config ARGS --libs   gtk+-2.0 OUTPUT_VARIABLE GTK_LIBS)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GTK_FLAGS}")

add_executable(program
program.cpp
)

target_link_libraries(program
${GTK_LIBS}
)