7

だから私はlibgstreamermm-0.10の例をコンパイルしていて、CMakeで問題が発生しました。

私のシステムにデフォルトでインストールされているlibgstreamermm-0.10のバージョンでは、segfaultsの例です。OK、最新のソースを入手して/ 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、link_directories行があるのに、CMakeはlinkコマンドに-Lを追加していません。そのため、/ usr / local / includeにある新しいバージョンのgstreamerのヘッダーを使用していますが、/ usr / local / libにあるバージョンを使用する場合は、代わりに/ usr/libのライブラリを使用しています。 。Pkg-Configはこれを認識し、それに応じて調整するようですが、CMakeは、内部でpkg-configを使用していても、リンクフラグを検出しません。

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

4

1 に答える 1

8

link_directoriesそれ以降に来るターゲットにのみ影響します。add_executableだから、あなたは電話の後にあなたを動かす必要がありlink_directoriesます。

于 2012-04-09T17:08:09.443 に答える