1

链接顺序很重要。我观察到,当我编译我的程序时:

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}")

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

4

2 回答 2

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}) 

参考问题

于 2013-08-02T04:12:23.760 回答
2

啊哈!经过大量搜索和一些试验和错误,我终于通过在我的 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}
)
于 2013-08-01T23:36:17.250 回答