Как настроить Cmake для создания проектов только для заголовков? - PullRequest
38 голосов
/ 11 мая 2011

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

После некоторых поисков я обнаружил, что вы можете 't для этого создайте обычную библиотеку, используя 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,Я не знаю, является ли это ошибкой, или я делаю это неправильно, или есть предпочтительный способ сделать это, поэтому, если у вас есть простое решение, пожалуйста, будьте моим гостем.

Ответы [ 3 ]

26 голосов
/ 20 июля 2012

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

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

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.

6 голосов
/ 17 мая 2017

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

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

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

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

add_executable(myexec ${MY_SOURCES})
target_link_libraries(myexec mylib)
2 голосов
/ 31 мая 2011

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

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

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

include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...