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