CMake目标只是编译源文件

问题描述 投票:1回答:2

我正在使用C ++ 17编写仅标头的库。我想将其包含在“虚拟”源文件中:

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

目的是确保库正确包含其所有依赖项。我还想在其上运行静态分析器,并在可行的情况下启用尽可能多的编译器检查来对其进行编译。

要创建普通的可执行目标,我需要添加main()函数,否则链接阶段将失败。我想我也可以创建一个静态库目标,该目标应该可以正常运行,尽管它会创建我不需要的工件。

还有其他选择吗?

c++ cmake compilation header-only
2个回答
1
投票
CMake可以创建一个简单的Object库,它将仅是.o.obj文件:

OBJECT库类型定义了通过编译给定源文件得到的目标文件的非归档集合。

为此,请在OBJECT命令中使用add_library()关键字:

add_library()

您以后可以引用要编译到其他库或可执行文件中的目标文件:

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


1
投票
大多数编译器允许您覆盖输入类型的默认扩展名。如果仅将add_library(MyLibrary STATIC $<TARGET_OBJECTS:MyObj> MyOtherSource.cpp HelpersFunctions.cpp ) 作为输入文件传递给编译器,它可以将其编译为my/library.hlibrary.o

请注意,除非编译可执行文件,否则您无法确定library.obj是否完整。特别是,C ++要求,如果非library.h inline类成员被过度使用,则每个程序必须对其定义一次。因此,如果您忘记了static const中的inline,则在简单测试中可能不会注意到这一点。而且,即使您添加一个空的library.h,也不会使用这些成员。

© www.soinside.com 2019 - 2024. All rights reserved.