Подтвердить что ты не робот

Как мне настроить CMake для генерации проектов только для заголовков?

Я хочу настроить проекты библиотек C++ (или C) только для заголовков, но не могу найти чистый путь.

После некоторых поисков я обнаружил, что вы не можете настроить обычную библиотеку, используя add_library чтобы сделать это, потому что для этого требуется скомпилированный исходный файл. Один из способов сделать это - использовать add_custom_target вместо этого:

# Get all headers (using search instead of explicit filenames for the example)
file( GLOB_RECURSE XSD_HEADERS 
    *.hxx
)
add_custom_target( libsxsd SOURCES ${XSD_HEADERS} )

Но это, похоже, не работает полностью, поскольку я не вижу источников в проекте, сгенерированном в VS2010. Я не знаю, если это ошибка или я делаю это неправильно или есть предпочтительный способ сделать это.

4b9b3361

Ответ 1

Обновление: В CMake скоро будет включен целевой объект библиотеки INTERFACE, который идеально подходит для проектов только для заголовков. Эта функция в настоящее время находится в главной ветке. Ссылка.

Используя команду add_custom_target, как вы предлагаете, работает для меня (VS2010). Файлы четко перечислены в моем проекте, но у него есть недостаток, что вы не можете определить какие-либо "дополнительные каталоги Include" с настраиваемой целью. Вместо этого теперь я использую следующее:

add_library(HEADER_ONLY_TARGET STATIC test1.hpp test2.hpp)
set_target_properties(HEADER_ONLY_TARGET PROPERTIES LINKER_LANGUAGE CXX)

Это настраивает проект только для заголовков как цель фиктивного архива. Не беспокойтесь, никаких реальных двоичных файлов не будет создано, если вы попытаетесь их построить (по крайней мере, не в VS2010 и Xcode 4). Команда set_target_properties существует там, потому что CMake в противном случае жалуется, что он не может выводить целевой язык только из файлов .hpp.

Ответ 2

Вы можете сделать это, используя последнюю функцию интерфейса библиотеки:

add_library(mylib INTERFACE)
target_include_directories(mylib INTERFACE my_include_dir1 my_include_dir2)

Это создает цель библиотеки без каких-либо исходных файлов и добавляет каталоги включения в свойство INTERFACE_INCLUDE_DIRECTORIES цели. Это означает, что любая цель, которая ссылается на эту библиотеку, получит эти каталоги как пути включения (-I) при -I.

Например, чтобы использовать библиотеку с исполняемой целью, просто выполните:

add_executable(myexec ${MY_SOURCES})
target_link_libraries(myexec mylib)

Ответ 3

Я думаю, что вы ищете просто добавить каталог include, используя "include_directories" команда для cmake.

При этом, если это сторонний инструмент, с которым у вас нет контроля, я также добавил бы флаг "SYSTEM".

Итак, команда будет выглядеть примерно так:

include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})