CMAKE внешняя локальная библиотека статическая C [дубликат]

39
задан Grumbel 22 March 2015 в 08:04
поделиться

4 ответа

Сначала вызов:

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

29
ответ дан Grumbel 19 August 2018 в 14:49
поделиться
  • 1
    Я согласен с тем, что pkg-config следует избегать IF a Найти * .cmake существует, но это все еще не относится к последней версии cmake в 2016 году. – Cubic 21 August 2016 в 14:07
  • 2
    Это не работает, если библиотеки не находятся в каталогах по умолчанию. link_directories () может быть обходным путем, но он глобальный. – Henry Hu 22 May 2018 в 03:15
  • 3
    – user2023370 24 August 2018 в 17:59
  • 4
    – Tim Visée 30 August 2018 в 20:32

Редко бывает, что нужно было бы связываться с 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.

2
ответ дан fluxrider 19 August 2018 в 14:49
поделиться
  • 1
    Исходные файлы с использованием Globbing - это плохая практика и не рекомендуется. – liberforce 23 February 2018 в 18:56

Если вы хотите добавить определения из библиотеки, для этого есть команда 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})
-2
ответ дан jeanluc 19 August 2018 в 14:49
поделиться
  • 1
    Не используйте include_directories и т. Д., Он будет заражать глобальную область! Используйте target_include_directories и т. Д. – Dawid Drozd 21 September 2017 в 11:23
  1. Нет такой команды, как target_use. Но я знаю несколько проектов, которые написали такую ​​команду для их внутреннего использования. Но каждый проект хочет передать дополнительные флаги или определяет, поэтому нет смысла иметь его вообще в CMake. Другая причина, по которой это не так: C ++-шаблонные библиотеки, такие как Eigen, нет библиотеки, но у вас есть только куча включенных файлов.
  2. Описанный способ часто правильный. Для некоторых библиотек это может различаться, тогда вам нужно будет добавить _LDFLAGS или _CFLAGS. Еще одна причина отсутствия target_use. Если это не сработает для вас, задайте новый вопрос, касающийся SDL2 или любой другой библиотеки, которую вы хотите использовать.
0
ответ дан usr1234567 19 August 2018 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: