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

Kla*_*aim 39 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} )
Run Code Online (Sandbox Code Playgroud)

但这似乎并不完全在这里工作,因为我看不到VS2010中生成的项目中的源代码.我不知道这是一个错误,或者我做错了,或者是否有一个首选的方法,所以如果你有一个简单的解决方案,请成为我的客人.

Fre*_*und 26

更新: CMake将很快包含一个名为INTERFACE的库目标,非常适用于仅限标题的项目.此功能目前在主分支中.参考.

建议使用命令add_custom_target(VS2010).这些文件整齐地列在我的项目中,但它的缺点是你不能用自定义目标定义任何"附加包含目录".相反,我现在使用以下内容:

add_library(HEADER_ONLY_TARGET STATIC test1.hpp test2.hpp)
set_target_properties(HEADER_ONLY_TARGET PROPERTIES LINKER_LANGUAGE CXX)
Run Code Online (Sandbox Code Playgroud)

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

  • 这是不可移植的,并且在编译时会因make而失败(错误`ar:没有指定存档成员`). (4认同)
  • 到目前为止,我能想出的最好方法是在库中添加一个`dummy.cpp`,以保持CMake和编译器的快乐.除了为仅头文件库创建不必要地创建中间静态库文件的噪音之外,它工作得很好. (3认同)
  • @ErikSjölund我发现老帖子,但INTERFACE库没有源依赖关系,因此标题不会显示在IDE中. (3认同)
  • [target_sources()](http://www.cmake.org/cmake/help/v3.2/command/target_sources.html)可能有助于使标头显示在IDE中.CMake命令是在CMake 3.1中引入的.另请参见http://stackoverflow.com/a/29218394 (2认同)

Sam*_*ter 6

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

add_library(mylib INTERFACE)
target_include_directories(mylib INTERFACE my_include_dir1 my_include_dir2)
Run Code Online (Sandbox Code Playgroud)

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

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

add_executable(myexec ${MY_SOURCES})
target_link_libraries(myexec mylib)
Run Code Online (Sandbox Code Playgroud)