链接订单很重要。当我用以下代码编译程序时,我观察到了
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文件的一部分,但我似乎没有找到正确的顺序。
答案 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}
)