gpt4 book ai didi

c++ - 防止 CMake 为仅可选 header 库生成的 makefile 在仅 header 模式下编译源文件

转载 作者:太空狗 更新时间:2023-10-29 23:50:43 26 4
gpt4 key购买 nike

我有一个库,既可以用作仅 header 库,也可以用作传统库。要启用此仅可选 header 功能,如果在仅 header 模式下编译,则该库包含 .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

当用户在他/她的项目之一中包含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 .)

不幸的是,CMake 生成的 makefile 总是 编译 .cpp 文件,即使启用了 header-only 模式并且目标是 HEADER_ONLY_TARGET.

如何防止 CMake 生成的 makefile 以仅 header 模式编译源文件?

请注意,依赖于 CMake 生成的输出的 IDE,例如 Qt Creator,应该将头文件和源文件显示为项目的一部分

如果我不对任何源文件进行 glob,而只对 .hpp 头文件进行 glob,CMake 将提示没有为库目标选择源文件,依赖 CMake 文件的 IDE 将不显示任何项目。

最佳答案

尝试设置源文件的 HEADER_FILE_ONLY 属性以防止构建它们,例如:

if (LIBRARY_HEADERONLY)
set_source_files_properties(${SRC_LIST} PROPERTIES HEADER_FILE_ONLY 1)
...
endif()

另见 documentation .

关于c++ - 防止 CMake 为仅可选 header 库生成的 makefile 在仅 header 模式下编译源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27866669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com