Как обрабатывать только заголовки третьих сторон с CMake? - PullRequest
1 голос
/ 08 ноября 2019

В проекте мы используем ExternalProject_add для управления обычными третьими лицами и управления процессом их загрузки и сборки (некоторые приходят с обычного URL, другие из репозитория git)

Недавно я столкнулся с необходимостьюдобавить лишнего третьего участника. Это пока единственная третья сторона только для заголовков. Для тех, кто заинтересован, это kvasir_mpl.

Однако, когда я пытаюсь target_link_libraries с kvasir_mpl, CMake всегда рассматривает его как обычную библиотеку, и в конце концов сборкасбои:

[83%] Связывание исполняемого приложения CXX
/ usr / bin / ld: невозможно найти -lkvasir_mpl

Я разработал минимальный пример для воспроизведенияпроблема:

. / CMakeLists.txt:

cmake_minimum_required( VERSION 3.7.0 )

project( Test CXX )

add_subdirectory( kvasir )
add_subdirectory( app )

. / app / CMakeLists.txt:

project( App CXX )

add_executable( app main.cpp )

target_link_libraries( app kvasir_mpl )

kvasirmpl / CMakeLists.txt:

cmake_minimum_required( VERSION 3.7.0 )

project( KvasirMpl )

include( ExternalProject )

ExternalProject_Add(
    3rdparty_kvasirmpl

    GIT_REPOSITORY https://github.com/kvasir-io/mpl
    GIT_TAG origin/development
    INSTALL_COMMAND ""
    BUILD_COMMAND "" )

Обратите внимание, что если я использую ключевое слово подпись target_link_libraries( app INTERFACE kvasir_mpl ), моя проблема будет решена. Однако в нашем реальном случае использования target_link_libraries запускается через пользовательские функции CMake и может передавать что угодно из файла обычной библиотеки в цель CMake, заставляя нас использовать простую подпись.

Есть ли способзаставить работать простую подпись в этом случае?

1 Ответ

0 голосов
/ 08 ноября 2019

В kvasirmpl / CMakeLists.txt добавьте следующие строки:

add_library(kvasir_mpl INTERFACE)
target_include_directories(kvasir_mpl PUBLIC <includedirs>)
set_target_properties(kvasir_mpl PROPERTIES LINKER_LANGUAGE CXX)

Это говорит о том, что CMake есть библиотека, не созданная CMake (Interface), то есть каталоги include при связывании с этой библиотекой. .. Вы также можете добавить дополнительные флаги компиляции и т. Д. Язык компоновщика должен быть указан, потому что CMake хочет знать, является ли он C или C ++, и не вычитает его в библиотеке только для заголовков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...