1

我正在使用 C++17 编写一个只有头文件的库。我想将它包含在一个“虚拟”源文件中:

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

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

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

还有其他选择吗?

4

2 回答 2

1

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

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

于 2020-03-02T12:34:05.517 回答
1

CMake 可以创建一个简单的对象库,它只是一个.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
)
于 2020-03-02T13:42:28.767 回答