2012-04-09 14 views
7

Quindi sto compilando gli esempi per libgstreamermm-0.10 e ho incontrato un problema con CMake.CMake Pkg-Config Library Link Path

Con la versione di libgstreamermm-0.10 installata per impostazione predefinita sul mio sistema, l'esempio segfaults. OK, quindi ho ricevuto le ultime fonti e le ho installate su/usr/local e ho ottenuto il nuovo esempio. Va tutto bene.

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

funziona correttamente e come previsto. Fantastico, ora cerca di farlo funzionare bene con CMake. Realizzo un veloce file CMakeLists.txt. Io uso pkg-config, perché ha funzionato bene e non voglio davvero aggiungere un modulo di ricerca. Quindi il mio file è simile al seguente:

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

tutto viene compilato fino alla fase di collegamento, dove ricevo errore con strani simboli. Vedo quindi che l'output di pkg-config --libs gstreamermm-0.10 inizia con -L/usr/local/lib. Guardo l'output di make VERBOSE=1 e CMake NON sta aggiungendo il comando -L al comando di collegamento, anche se ho la linea link_directories. Quindi, anche se sto usando le intestazioni per la nuova versione di gstreamer in/usr/local/include, la libreria da/usr/lib viene invece utilizzata, quando voglio che la versione in/usr/local/lib sia usata . Pkg-Config sembra riprendere questo, e si adegua di conseguenza, ma CMake, anche se ho usato pkg-config internamente, non rileva i flag di collegamento.

Potrei impostare manualmente i flag di collegamento per ora, ma sembra un po 'un trucco. Sono sicuro che c'è un modo migliore per specificare questo.

risposta

8

link_directories riguarda solo gli obiettivi che vengono AFTER it. Quindi, è necessario per spostare il tuo add_executable dopo la chiamata link_directories.

+0

Ho. Sto usando la direttiva link_directories(), quindi dovrebbe aggiungere -L? Immagino di non fraintendere cosa fa link_directories(). Potrei usare la variabile LDFLAGS, ma non sono sicuro di come farlo e non bombardare i flag di linker di CMake. –

+0

Giusto, nuova risposta in arrivo ... – Anonymous

+0

Questo ha funzionato, grazie! –