CMake 目标只是编译一个源文件

CMake target to just compile a source file

我正在使用 C++17 编写一个仅包含头文件的库。我想将其包含在 "dummy" 源文件中:

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

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

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

还有其他选择吗?

大多数编译器允许您覆盖输入类型的默认扩展名。如果您只是将 my/library.h 作为输入文件传递给编译器,它可以将其编译成 library.olibrary.obj.

请注意,如果不编译可执行文件,您无法确定 library.h 是否完整。特别是,C++ 要求非 inline static const class 成员在每个程序中只定义一次,如果它们是 odr-used。因此,如果您在 library.h 中忘记了 inline,您可能不会在简单测试中注意到这一点。即使您添加一个空 main(),仍然不会使用这些成员。

CMake 可以创建一个简单的 Object 库,它只会是一个 .o.obj 文件:

The OBJECT library type defines a non-archival collection of object files resulting from compiling the given source files.

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

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
)