How do I set up CMake to generate header-only projects?

前端 未结 3 1955

I want to set up header-only C++ (or C) library projects, but can\'t find a clean way.

After some searches I\'ve found that you can\'t set up a normal library using

相关标签:
3条回答
  • 2020-12-24 01:49

    You can do this using the recent Interface Library feature:

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

    This creates a library target without any source files, and adds the include directories to the INTERFACE_INCLUDE_DIRECTORIES property of the target. This means that any target that links to this library will get these directories as include paths (-I) when built.

    For instance, to use the library with an executable target, just do:

    add_executable(myexec ${MY_SOURCES})
    target_link_libraries(myexec mylib)
    
    0 讨论(0)
  • 2020-12-24 01:53

    I think what you are looking for is just adding an include directory using the "include_directories" command for cmake.

    When doing this, if it is a third party tool that you don't have control over, I would also add the "SYSTEM" flag.

    So you command would look like something like this:

    include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})
    
    0 讨论(0)
  • 2020-12-24 02:14

    Update: CMake will soon include a library target called INTERFACE that is ideal for header-only projects. This feature is currently in the master branch. Reference.

    Using the command add_custom_target as you propose works for me (VS2010). The files are neatly listed within my project but it has the drawback that you can't define any "Additional Include Directories" with a custom target. Instead, I now use the following:

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

    This sets up your header-only project as a dummy archive target. Don't worry, no actual binaries will be generated if you should try and build it (at least not in VS2010 and Xcode 4). The command set_target_properties is there because CMake will otherwise complain that it cannot infer the target language from .hpp files only.

    0 讨论(0)
提交回复
热议问题