CMake 目标只是编译一个源文件
CMake target to just compile a source file
我正在使用 C++17 编写一个仅包含头文件的库。我想将其包含在 "dummy" 源文件中:
#include "my/library.h"
// EOF
目的是确保库正确包含其所有依赖项。我还想在其上 运行 静态分析器并在尽可能多的启用编译器检查的情况下对其进行编译。
要创建一个正常的可执行目标,我需要添加 main()
函数,否则链接阶段将失败。
我想我也可以创建一个静态库目标,它应该可以正常工作,尽管它会创建一个我不需要的工件。
还有其他选择吗?
大多数编译器允许您覆盖输入类型的默认扩展名。如果您只是将 my/library.h
作为输入文件传递给编译器,它可以将其编译成 library.o
或 library.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
)
我正在使用 C++17 编写一个仅包含头文件的库。我想将其包含在 "dummy" 源文件中:
#include "my/library.h"
// EOF
目的是确保库正确包含其所有依赖项。我还想在其上 运行 静态分析器并在尽可能多的启用编译器检查的情况下对其进行编译。
要创建一个正常的可执行目标,我需要添加 main()
函数,否则链接阶段将失败。
我想我也可以创建一个静态库目标,它应该可以正常工作,尽管它会创建一个我不需要的工件。
还有其他选择吗?
大多数编译器允许您覆盖输入类型的默认扩展名。如果您只是将 my/library.h
作为输入文件传递给编译器,它可以将其编译成 library.o
或 library.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
)