Сначала вызов:
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
Редко бывает, что нужно было бы связываться с SDL2. В настоящее время популярный ответ использует pkg_search_module()
, который проверяет данные модули и использует первый рабочий.
Скорее всего, вы хотите установить связь с SDL2 и SDL2_Mixer и SDL2_TTF и т. Д. pkg_check_modules()
проверяет все данные модули.
# sdl2 linking variables
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2 SDL2_ttf SDL2_mixer SDL2_image)
# your app
file(GLOB SRC "my_app/*.c")
add_executable(my_app ${SRC})
target_link_libraries(my_app ${SDL2_LIBRARIES})
target_include_directories(my_app PUBLIC ${SDL2_INCLUDE_DIRS})
target_compile_options(my_app PUBLIC ${SDL2_CFLAGS_OTHER})
Отказ от ответственности: я бы просто прокомментировал сам ответ Грюмбеля, если у меня было достаточно уличных кредитов с помощью stackoverflow.
Если вы хотите добавить определения из библиотеки, для этого есть команда add_definitions
. Документацию можно найти здесь здесь , а также больше способов добавить флаги компилятора.
Следующий фрагмент кода использует эту инструкцию для добавления GTKGL в проект:
pkg_check_modules(GTKGL REQUIRED gtkglext-1.0)
include_directories(${GTKGL_INCLUDE_DIRS})
link_directories(${GTKGL_LIBRARY_DIRS})
add_definitions(${GTKGL_CFLAGS_OTHER})
set(LIBS ${LIBS} ${GTKGL_LIBRARIES})
target_link_libraries([insert name of program] ${LIBS})
include_directories
и т. Д., Он будет заражать глобальную область! Используйте target_include_directories
и т. Д.
– Dawid Drozd
21 September 2017 в 11:23
target_use
. Но я знаю несколько проектов, которые написали такую команду для их внутреннего использования. Но каждый проект хочет передать дополнительные флаги или определяет, поэтому нет смысла иметь его вообще в CMake. Другая причина, по которой это не так: C ++-шаблонные библиотеки, такие как Eigen, нет библиотеки, но у вас есть только куча включенных файлов. _LDFLAGS
или _CFLAGS
. Еще одна причина отсутствия target_use
. Если это не сработает для вас, задайте новый вопрос, касающийся SDL2 или любой другой библиотеки, которую вы хотите использовать.