2012-04-09 5 views
7

Also ich kompiliere die Beispiele für libgstreamermm-0.10, und ich habe ein Problem mit CMake.CMake Pkg-Config Bibliothek Link Pfad

Mit der Version von libgstreamermm-0.10, die standardmäßig auf meinem System installiert ist, das Beispiel segfaults. OK, also habe ich die neuesten Quellen und installiert sie nach/usr/local und bekomme das neue Beispiel. Alles sieht gut aus.

g++ main.cc player_window.cc -o test `pkg-config --cflags --libs gtkmm-3.0` `pkg-config --cflags --libs gstreamermm-0.10` 

funktioniert gut und wie erwartet. Großartig, jetzt, um es mit CMake spielen zu lassen. Ich mache eine schnelle CMakeLists.txt-Datei. Ich benutze pkg-config, das hat gut funktioniert und ich möchte nicht wirklich ein Suchmodul hinzufügen. Also meine Datei sieht wie folgt aus:

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}) 

Alles kompiliert, bis die Verknüpfungsstufe, wo ich Fehler wegen undefinierter Symbole erhalten. Ich sehe dann die Ausgabe von pkg-config --libs gstreamermm-0.10 beginnt mit -L/usr/local/lib. Ich schaue auf die Ausgabe von make VERBOSE=1 und CMake fügt nicht die -L zum Link-Befehl, obwohl ich die Zeile link_directories habe. Obwohl ich die Header für die neue Version von gstreamer in/usr/local/include verwende, wird stattdessen die Bibliothek von/usr/lib verwendet, wenn ich die Version in/usr/local/lib verwenden möchte . Pkg-Config scheint dies zu akzeptieren und passt sich dementsprechend an, aber CMake, obwohl ich es intern mit pkg-config verwende, greift die Link Flags nicht auf.

Ich könnte die Link-Flags für jetzt manuell festlegen, aber das scheint ein bisschen wie ein Hack. Ich bin mir sicher, dass es eine bessere Möglichkeit gibt, dies zu spezifizieren.

Antwort

8

link_directories betrifft nur Ziele, die AFTER it kommen. So müssen Sie Ihre add_executable nach dem link_directories Anruf verschieben.

+0

Ich habe. Ich verwende die Anweisung link_directories(), also sollte die -L hinzugefügt werden? Ich nehme an, ich missverstände, was link_directories() tut. Ich könnte die LDFLAGS-Variable verwenden, aber ich bin mir nicht sicher, wie ich das machen soll und nicht die Linker-Flags von CMake überlisten soll. –

+0

Richtig, neue Antwort kommt ... – Anonymous

+0

Das tat es, danke! –

Verwandte Themen