2012-04-09 5 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を使いました。うまくいきましたが、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}) 

すべてが、私は未定義のシンボルエラーを取得し、リンクステージまでコンパイルされます。次に、-L/usr/local/libで始まるpkg-config --libs gstreamermm-0.10の出力を確認します。私はmake VERBOSE=1の出力を見て、私はlink_directories行を持っていますが、CMakeはリンクコマンドに-Lを加えていません。したがって、/ usr/local/includeの新しいバージョンのgstreamerのヘッダーを使用していても、代わりに/ usr/libのライブラリが使用されています。 。 Pkg-Configはこれを拾ってそれに応じて調整するようですが、CMakeはpkg-configを内部的に使っていてもリンクフラグを拾わない。

リンクフラグを手動で設定することはできますが、それはちょっとしたハックのようです。これを指定するより良い方法があると確信しています。

答えて

8

link_directoriesは、AFTER itになるターゲットにのみ影響します。したがって、add_executablelink_directoriesコールの後に移動するには、 が必要です。

+0

私は持っています。私はlink_directories()ディレクティブを使用していますので、-Lを追加する必要がありますか?私はlink_directories()が何をしているのか誤解していると思います。私は、LDFLAGS変数を使用することができますが、私はそれを行う方法ではなく、CMakeの独自のリンカーフラグをclobberではない。 –

+0

正直、新しい答えが来る... – Anonymous

+0

それは、ありがとう! –

関連する問題