如何设置Cmake来生成只有标题的项目?

标题说这一切:我想要设置仅头C ++(或C)库项目,但无法find一个干净的方式。

经过一番search,我发现你不能使用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中生成的项目的来源。 我不知道这是否是一个错误,或者如果我做错了,或者如果有一个最好的方式来做到这一点,所以如果你有一个简单的解决scheme,请成为我的客人。

更新: CMake将很快包括一个名为INTERFACE的库目标,这是理想的头标项目。 此function目前在主分支中。 参考 。

使用命令add_custom_target因为你build议适合我(VS2010)。 这些文件整齐地在我的项目中列出,但它的缺点是你不能定义任何“附加包含目录”与自定义目标。 相反,我现在使用以下内容:

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

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

您可以使用最近的“ 接口库”function执行此操作:

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

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

例如,要使用带有可执行目标的库,只需执行:

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

我认为你正在寻找的只是使用cmake的“include_directories”命令添加一个包含目录。

当这样做,如果它是你没有控制权的第三方工具,我也会添加“系统”标志。

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

 include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})