如何设置Cmake以生成仅限标题的项目?

时间:2011-05-10 22:14:09

标签: c++ c build cmake

标题说明了一切:我想设置仅限标题的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中生成的项目中的源代码。我不知道这是一个错误,或者我做错了,或者是否有一个首选的方法,所以如果你有一个简单的解决方案,请成为我的客人。

3 个答案:

答案 0 :(得分:26)

更新:CMake很快将包含一个名为INTERFACE的库目标,非常适用于仅限标题的项目。此功能目前在主分支中。 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)

这会将仅标题项目设置为虚拟归档目标。不要担心,如果您应该尝试构建它,不会生成实际的二进制文件(至少在VS2010和Xcode 4中不会)。命令set_target_properties就在那里,因为CMake会抱怨它不能仅从.hpp文件中推断出目标语言。

答案 1 :(得分:6)

您可以使用最近的Interface Library功能执行此操作:

add_library(mylib INTERFACE)
target_include_directories(mylib INTERFACE my_include_dir1 my_include_dir2)

这将创建一个没有任何源文件的库目标,并将include目录添加到目标的INTERFACE_INCLUDE_DIRECTORIES属性中。这意味着链接到此库的任何目标在构建时都会将这些目录作为包含路径(-I)。

例如,要将库与可执行目标一起使用,只需执行:

add_executable(myexec ${MY_SOURCES})
target_link_libraries(myexec mylib)

答案 2 :(得分:2)

我认为你要找的只是添加一个包含目录 "include_directories" command for cmake.

执行此操作时,如果它是您无法控制的第三方工具,我还会添加“SYSTEM”标记。

所以你的命令看起来像这样:

include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})