Путь ссылки библиотеки CMake Pkg-Config

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

С версией 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, так как он работал нормально, и я действительно не хочу добавлять модуль поиска. Итак, мой файл выглядит так:

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, не улавливает флаги ссылок.

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


person Robert Mason    schedule 09.04.2012    source источник


Ответы (1)


link_directories влияет только на цели, которые приходят ПОСЛЕ этого. Итак, вам нужно переместить свой add_executable так, чтобы он находился после вызова link_directories.

person Anonymous    schedule 09.04.2012
comment
У меня есть. Я использую директиву link_directories (), поэтому она должна добавить -L? Думаю, я неправильно понимаю, что делает link_directories (). Я мог бы использовать переменную LDFLAGS, но я не уверен, как это сделать, и не сбивать собственные флаги компоновщика CMake. - person Robert Mason; 09.04.2012