Во-первых, звонок:
include(FindPkgConfig)
следует заменить на:
find_package(PkgConfig)
Вызов find_package()
более гибкий и позволяет использовать такие параметры, как REQUIRED
, которые автоматически выполняют действия, которые можно было бы делать вручную с помощью include()
.
Во-вторых, по возможности следует избегать ручного вызова pkg-config
. CMake поставляется с богатым набором определений пакетов, которые можно найти в Linux в разделе /usr/share/cmake-3.0/Modules/Find*cmake
. Они предоставляют пользователю больше возможностей и выбора, чем простой вызов pkg_search_module()
.
Что касается упомянутой гипотетической команды target_use()
, в CMake уже есть встроенная функция PUBLIC | PRIVATE | INTERFACE. Вызов типа target_include_directories(mytarget PUBLIC ...)
вызовет автоматическое использование подключаемых каталогов в каждой цели, которая использует mytarget
, например target_link_libraries(myapp mytarget)
. Однако этот механизм, похоже, предназначен только для библиотек, созданных в файле CMakeLists.txt
, и не работает для библиотек, полученных с помощью pkg_search_module()
. Для этого можно использовать вызов add_library(bar SHARED IMPORTED)
, но я еще не рассматривал это.
Что касается главного вопроса, то здесь это работает в большинстве случаев:
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
...
target_link_libraries(testapp ${SDL2_LIBRARIES})
target_include_directories(testapp PUBLIC ${SDL2_INCLUDE_DIRS})
target_compile_options(testapp PUBLIC ${SDL2_CFLAGS_OTHER})
SDL2_CFLAGS_OTHER
содержит определения и другие флаги, необходимые для успешной компиляции. Флаги SDL2_LIBRARY_DIRS
и SDL2_LDFLAGS_OTHER
по-прежнему игнорируются, не знаю, как часто это может стать проблемой.
Дополнительная документация здесь http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html
person
Grumbel
schedule
28.03.2015