2012-04-09 3 views
7

Итак, я компилирую примеры для libgstreamermm-0.10, и у меня возникла проблема с CMake.CMake Pkg-Config Library Link Path

С версией 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}) 

Все не компилирует до стадии ссылки, где я получаю неопределенные ошибки символа. Затем я вижу, что вывод pkg-config --libs gstreamermm-0.10 начинается с -L/usr/local/lib. Я смотрю вывод make VERBOSE=1, а CMake НЕ добавляет -L к команде ссылки, хотя у меня есть строка link_directories. Поэтому, хотя я использую заголовки для новой версии gstreamer в/usr/local/include, вместо этого используется библиотека из/usr/lib, когда я хочу использовать версию в/usr/local/lib , Кажется, что Pkg-Config подходит к этому и настраивается соответствующим образом, но CMake, даже если я его использую с помощью pkg-config внутри, не поднимает флаги ссылок.

Я могу вручную установить флаги ссылок на данный момент, но это похоже на взлома. Я уверен, что есть лучший способ указать это.

ответ

8

link_directories влияет только на цели, которые приходят AFTER it. Итак, вам нужно , чтобы переместить add_executable после звонка link_directories.

+0

У меня есть. Я использую директиву link_directories(), поэтому он должен добавить -L? Наверное, я не понимаю, что делает link_directories(). Я мог бы использовать переменную LDFLAGS, но я не уверен, как это сделать, а не clobber CMake собственных флагов компоновщика. –

+0

Правильно, новый ответ подходит ... – Anonymous

+0

Это сделало, спасибо! –