Сначала вызов:
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 | ИНТЕРФЕЙС. Вызов типа 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