Vit*_*meo 3 c++ makefile cmake header-files header-only
我有一个库,它既可以用作仅标头库,也可以用作传统库。为了启用这个可选的仅头.cpp文件功能,如果在仅头文件模式下编译,库将包含源文件。例子:
// Vector.hpp
// (Module file), intended to be included manually by the user
#ifndef LIBRARY_MODULE_VECTOR
#define LIBRARY_MODULE_VECTOR
#include "Library/Vector/Inc/Vector2.hpp"
#include "Library/Vector/Inc/Vector3.hpp"
#include "Library/Vector/Inc/VectorUtils.hpp"
#if defined(LIBRARY_HEADERONLY)
#include "Library/Vector/Src/Vector2.cpp"
#include "Library/Vector/Src/Vector3.cpp"
#include "Library/Vector/Src/VectorUtils.cpp"
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
当用户Vector.hpp在他/她的项目之一中包含时,如果LIBRARY_HEADERONLY定义了,则实现源文件将被包含在头文件之后。小心使用inline关键字以避免多重定义。
如果LIBRARY_HEADERONLY未定义,.cpp则将编译文件并且必须链接库。
我选择的构建系统是CMake。
使用 CMake 标志,用户可以定义或取消定义LIBRARY_HEADERONLY。
该CMakeLists.txt文件类似于:
# (not shown) set flag and cache variables...
# Include library directory
include_directories("./${INCLUDE_DIRECTORY}")
# Glob all library header/source files
file(GLOB_RECURSE SRC_LIST "${INC_DIR}/*" "${SRC_DIR}/*")
# (Not shown) Check if header-only mode is enabled
# (from now on we assume header-only mode is enabled and that
# LIBRARY_HEADERONLY is defined)
# Use all source/header files as a library target
add_library(HEADER_ONLY_TARGET STATIC ${SRC_LIST})
set_target_properties(HEADER_ONLY_TARGET PROPERTIES LINKER_LANGUAGE CXX)
install(DIRECTORY ${INC_DIR} DESTINATION .)
Run Code Online (Sandbox Code Playgroud)
不幸的是,CMake 生成的 makefile总是编译.cpp文件,即使启用了仅标头模式并且目标是HEADER_ONLY_TARGET.
如何防止 CMake 生成的 makefile 在仅标头模式下编译源文件?
请注意,依赖于 CMake 生成的输出的 IDE,例如 Qt Creator,应该将头文件和源文件都显示为项目的一部分。
如果我没有 glob 任何源文件,而只是.hpp头文件,CMake 会抱怨没有为库目标选择源文件,依赖 CMake 文件的 IDE 将不会显示任何项目。
尝试设置源文件的HEADER_FILE_ONLY属性以防止它们构建,例如:
if (LIBRARY_HEADERONLY)
set_source_files_properties(${SRC_LIST} PROPERTIES HEADER_FILE_ONLY 1)
...
endif()
Run Code Online (Sandbox Code Playgroud)
另请参阅文档。
| 归档时间: |
|
| 查看次数: |
1061 次 |
| 最近记录: |