CMake Pkg-Config库链接路径

7

我正在编译libgstreamermm-0.10的示例,并遇到了CMake的问题。

使用系统默认安装的libgstreamermm-0.10版本,示例会崩溃。好的,我获取了最新的源代码并将其安装到/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,因为它可以正常工作,而且我不想添加查找模块。所以我的文件看起来像这样:

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个回答

8

link_directories只影响在它之后的目标。因此,您需要将add_executable移到link_directories调用之后。


我有。我正在使用link_directories()指令,所以它应该添加-L吗?我想我误解了link_directories()的作用。我可以使用LDFLAGS变量,但我不确定如何做到这一点而不破坏CMake自己的链接器标志。 - Robert Mason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接