2012-04-09 46 views
7

因此,我正在編譯libgstreamermm-0.10的示例,並且遇到了CMake的一個問題。CMake Pkg-Config庫鏈接路徑

在我的系統上默認安裝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,因爲這工作得很好,我真的不想添加一個查找模塊。所以,我的文件看起來像這樣:

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,也不會在鏈接標誌上出現。

我現在可以手動設置鏈接標誌,但這似乎有點破解。我確定有更好的方法來指定這個。

回答

8

link_directories隻影響到目標AFTER it。所以,您需要 將您的add_executable移至link_directories之後。

+0

我有。我使用link_directories()指令,所以它應該添加-L?我想我誤解了link_directories()的作用。我可以使用LDFLAGS變量,但我不知道如何做到這一點,而不是打破CMake自己的鏈接器標誌。 – 2012-04-09 17:11:34

+0

對,新的答案來了... – Anonymous 2012-04-09 17:15:37

+0

這樣做了,謝謝! – 2012-04-09 17:17:10