Что надлежащий путь состоит в том, чтобы использовать 'pkg-конфигурацию' от 'cmake'?

При оглядывании в сети я видел много кода как это:

include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2)

target_include_directories(app SYSTEM PUBLIC ${SDL2_INCLUDE_DIRS}
target_link_libraries(app ${SDL2_LIBRARIES})

Однако это, кажется, неправильный путь о выполнении его, поскольку это только использует включать каталоги и библиотеки, но проигнорированный определяет, пути к библиотеке и другие флаги, которые могли бы быть возвращены pkg-config.

Что было бы корректным способом сделать это и гарантировать что вся компиляция и флаги ссылки, возвращенные pkg-config используются скомпилированным app? И есть ли единственная команда для выполнения этого, т.е. чего-то как target_use(app SDL2)?

касательно:

58
задан 22 March 2019 в 20:11

2 ответа

Другие методы, которые, как замечают ниже сбоя, настраивали пути компоновщика для тех общих библиотек, которые не найдены под типичными установленными местоположениями (такими как/usr/lib) получающуюся ошибку компоновщика, были /usr/bin/ld: cannot find -llibrary-1.0. Для моего случая pkg-файлы-конфигурации не были установлены также, и пути pkg-конфигурации для проекта были добавлены с помощью переменной среды PKG_CONFIG_PATH. Это - изложенная кратко версия рабочего CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project(ya-project C)

find_package(PkgConfig REQUIRED)

pkg_check_modules(MY_PKG REQUIRED IMPORTED_TARGET any-package)
pkg_check_modules(YOUR_PKG REQUIRED IMPORTED_TARGET ya-package)

add_executable(program-name file.c ya.c)

target_link_libraries(program-name
        PkgConfig::MY_PKG
        PkgConfig::YOUR_PKG)
2
ответ дан 1 November 2019 в 15:00

Большинству доступных ответов не удается настроить заголовки для pkg-config библиотека. После размышления на Документация для FindPkgConfig я предложил решение, которое предоставляет им также:

include(FindPkgConfig)
if(NOT PKG_CONFIG_FOUND)
  message(FATAL_ERROR "pkg-config not found!" )
endif()

pkg_check_modules(<some-lib> REQUIRED IMPORTED_TARGET <some-lib>)

target_link_libraries(<my-target> PkgConfig::<some-lib>)

( Замена Ваша цель вместо <my-target> и безотносительно библиотеки вместо <some-lib>, соответственно. )

IMPORTED_TARGET опция, кажется, является ключевой и делает все затем avaiable под PkgConfig:: пространство имен. Это было всем, что требовалось и также все, что должно требоваться.

2
ответ дан 1 November 2019 в 15:00

Другие вопросы по тегам:

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