我正在编译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,它也无法捕捉到链接标志。暂时我可以手动设置链接标志,但那似乎有点投机取巧。我相信肯定有更好的方法来指定这个问题。