Как мне настроить 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. Я не знаю, если это ошибка или я делаю это неправильно или есть предпочтительный способ сделать это.
Ответы
Ответ 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})