我正在使用C ++ 17编写仅标头的库。我想将其包含在“虚拟”源文件中:
#include "my/library.h"
// EOF
目的是确保库正确包含其所有依赖项。我还想在其上运行静态分析器,并在可行的情况下启用尽可能多的编译器检查来对其进行编译。
要创建普通的可执行目标,我需要添加main()
函数,否则链接阶段将失败。我想我也可以创建一个静态库目标,该目标应该可以正常运行,尽管它会创建我不需要的工件。
还有其他选择吗?
.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})
add_library(MyLibrary STATIC
$<TARGET_OBJECTS:MyObj>
MyOtherSource.cpp
HelpersFunctions.cpp
)
作为输入文件传递给编译器,它可以将其编译为my/library.h
或library.o
。请注意,除非编译可执行文件,否则您无法确定library.obj
是否完整。特别是,C ++要求,如果非library.h
inline
类成员被过度使用,则每个程序必须对其定义一次。因此,如果您忘记了static const
中的inline
,则在简单测试中可能不会注意到这一点。而且,即使您添加一个空的library.h
,也不会使用这些成员。