CMake Pkg-Config库链接路径

时间:2012-04-09 17:03:22

标签: linker cmake pkg-config

所以我正在编译libgstreamermm-0.10的例子,我遇到了CMake的问题。

在我的系统上默认安装了libgstreamermm-0.10的版本,示例为segfaults。好的,所以我获得了最新的源代码并将它们安装到/ usr / local并获得了新的示例。一切都很好看。

g++ main.cc player_window.cc -o test `pkg-config --cflags --libs gtkmm-3.0` `pkg-config --cflags --libs gstreamermm-0.10`

正常工作并且符合预期。很棒,现在尝试让它与CMake很好地配合。我制作了一个快速的CMakeLists.txt文件。我使用pkg-config,因为它工作正常,我真的不想添加一个find模块。所以我的文件看起来像这样:

cmake_minimum_required(VERSION 2.6.2)
project(media_player_gtkmm)

INCLUDE(FindPkgConfig)

set(SOURCES main.cc player_window.cc)

add_executable(media_player_gtkmm ${SOURCES})

#dependencies
pkg_check_modules(GSTMM REQUIRED gstreamermm-0.10)
pkg_check_modules(GTKMM REQUIRED gtkmm-3.0)
include_directories(${GTKMM_INCLUDE_DIRS} ${GSTMM_INCLUDE_DIRS})
link_directories(${GTKMM_LIBRARY_DIRS} ${GSTMM_LIBRARY_DIRS})
target_link_libraries(media_player_gtkmm ${GTKMM_LIBRARIES} ${GSTMM_LIBRARIES})

所有内容都会编译,直到链接阶段,我得到未定义的符号错误。然后我看到pkg-config --libs gstreamermm-0.10的输出以-L / usr / local / lib开头。我查看make VERBOSE=1的输出,并且CMake没有在链接命令中添加-L,即使我有link_directories行。所以,即使我在/ usr / local / include中使用新版gstreamer的头文件,但是当我想要使用/ usr / local / lib中的版本时,正在使用来自/ usr / lib的库。 。 Pkg-Config似乎已经接受了这一点,并相应地进行了调整,但是CMake,即使我在内部使用pkg-config,也没有选择链接标志。

我现在可以手动设置链接标志,但这看起来有点像黑客。我确信有更好的方法来指定它。

1 个答案:

答案 0 :(得分:8)

link_directories仅影响AFTER it的目标。所以,你需要 将add_executable移至link_directories来电之后。