CMake цель, чтобы просто скомпилировать исходный файл - PullRequest
1 голос
/ 02 марта 2020

Я пишу библиотеку только для заголовков, используя C ++ 17. Я хотел бы включить его в «фиктивный» исходный файл:

#include "my/library.h"
// EOF

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

Чтобы создать обычную исполняемую цель, мне нужно добавить функцию main(), в противном случае связывание этап провалится. Думаю, я также могу создать библиотечную цель stati c, которая должна работать правильно, хотя она создаст артефакт, который мне не нужен.

Есть ли какая-либо другая альтернатива?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

CMake может создать простую библиотеку Object , которая будет только файлом .o или .obj:

Тип библиотеки OBJECT определяет не архивная коллекция объектных файлов, полученных в результате компиляции заданных исходных файлов.

Для этого используйте ключевое слово OBJECT с командой add_library():

add_library(MyObj OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/library.cpp)
target_include_directories(MyObj PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

Позже вы можете ссылаться на объектные файлы для компиляции в другие библиотеки или исполняемые файлы:

add_library(MyLibrary STATIC 
    $<TARGET_OBJECTS:MyObj> 
    MyOtherSource.cpp 
    HelpersFunctions.cpp
)
1 голос
/ 02 марта 2020

Большинство компиляторов позволяют вам переопределить расширение по умолчанию для типов ввода. Если вы просто передадите my/library.h в качестве входного файла компилятору, он может скомпилировать его в library.o или library.obj.

Обратите внимание, что если не считать компиляцию исполняемого файла, вы не можете быть уверены, что ваш library.h завершен. В частности, C ++ требует, чтобы не-inline static const члены класса определялись ровно один раз для каждой программы, если они используются в odr. Поэтому, если вы забудете inline в своем library.h, вы можете не заметить этого в своем простом тесте. И даже если бы вы добавили пустой main(), это все равно не использовало бы эти элементы.

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