c++ - 如何设置 CMake 以生成仅 header 项目?

我想设置只有 header 的 C++(或 C)库项目,但找不到干净的方法。

经过一些搜索,我发现您无法使用 add_library 设置普通库来执行此操作,因为它需要可编译的源文件。 一种方法是使用 add_custom_target 代替,这样:

# Get all headers (using search instead of explicit filenames for the example)
file( GLOB_RECURSE XSD_HEADERS 
    *.hxx
)
add_custom_target( libsxsd SOURCES ${XSD_HEADERS} )

但这似乎并不完全在这里工作,因为我看不到在 VS2010 中生成的项目中的源代码。我不知道这是错误还是我做错了,或者是否有首选方法。

最佳答案

更新: CMake 将很快包含一个名为 INTERFACE 的库目标,该库目标非常适合仅包含 header 的项目。此功能目前在 master 分支中。 Reference .

按照您的建议使用命令 add_custom_target 对我有用(VS2010)。这些文件整齐地列在我的项目中,但它的缺点是您无法使用自定义目标定义任何“附加包含目录”。相反,我现在使用以下内容:

add_library(HEADER_ONLY_TARGET STATIC test1.hpp test2.hpp)
set_target_properties(HEADER_ONLY_TARGET PROPERTIES LINKER_LANGUAGE CXX)

这会将您的仅 header 项目设置为虚拟存档目标。不用担心,如果您尝试构建它,将不会生成实际的二进制文件(至少在 VS2010 和 Xcode 4 中不会)。命令 set_target_properties 在那里,因为 CMake 否则会提示它不能仅从 .hpp 文件推断目标语言。

https://stackoverflow.com/questions/5957134/

相关文章:

build - 如何将 build.gradle 目录传递给 gradlew?

java - 使用 SBT 构建纯 Java 项目

c# - Visual Studio 中的 "build"和 "rebuild"有什么区别?

xcode - 如何在 Xcode 5 中自动增加内部版本号

build - 有 CMake 递归扫描文件夹吗?

c - CMake下的多个目录

java - 如何使用 pom.xml 将参数传递给 Maven 构建?

git - Jenkins:一个项目的多个 Git 存储库

visual-studio - 使用 Installshield LE 包含标记为 "Copy to

c++ - 在编译时使用 C++ 在目标代码中嵌入时间戳