我正在使用 C++17 编写一个只有头文件的库。我想将它包含在一个“虚拟”源文件中:
#include "my/library.h"
// EOF
目的是确保库正确包含其所有依赖项。我还想在其上运行静态分析器,并在启用尽可能多的编译器检查的情况下对其进行编译。
要创建一个正常的可执行目标,我需要添加该main()
函数,否则链接阶段将失败。我想我也可以创建一个静态库目标,它应该可以正常工作,尽管它会创建一个我不需要的工件。
还有其他选择吗?
我正在使用 C++17 编写一个只有头文件的库。我想将它包含在一个“虚拟”源文件中:
#include "my/library.h"
// EOF
目的是确保库正确包含其所有依赖项。我还想在其上运行静态分析器,并在启用尽可能多的编译器检查的情况下对其进行编译。
要创建一个正常的可执行目标,我需要添加该main()
函数,否则链接阶段将失败。我想我也可以创建一个静态库目标,它应该可以正常工作,尽管它会创建一个我不需要的工件。
还有其他选择吗?
大多数编译器允许您覆盖输入类型的默认扩展名。如果您只是将my/library.h
输入文件作为输入文件传递给编译器,它可以将其编译为 alibrary.o
或library.obj
.
请注意,如果不编译可执行文件,您无法确定您的library.h
是否完整。特别是,如果非inline
static const
类成员被 odr-used,C++ 要求每个程序只定义一次非类成员。所以如果你忘记inline
了library.h
,你可能不会在你的简单测试中注意到这一点。即使您添加一个 empty main()
,仍然不会使用这些成员。
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
)