如何在CMake中正确配置仅头文件的C++模板库?
仅头文件C++库的CMake优雅配置方案
不用添加空的cmake_dummy.cpp,CMake专门提供了INTERFACE库来处理仅头文件库的场景,完全适配你的需求,具体实现步骤如下:
1. 为仅头文件库编写CMakeLists.txt
以htcw_bits为例,在其根目录创建CMakeLists.txt,用INTERFACE类型声明库:
# htcw_bits/CMakeLists.txt add_library(htcw_bits INTERFACE) # 导出自身包含目录,INTERFACE关键字会让依赖它的库自动继承这些路径 target_include_directories(htcw_bits INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include" ) # 可选:如果库需要特定编译标准或宏定义,可在此添加 # target_compile_features(htcw_bits INTERFACE cxx_std_17) # target_compile_definitions(htcw_bits INTERFACE BITS_ENABLE_FEATURE_X)
2. 在依赖库中关联INTERFACE库
修改htcw_io的CMakeLists.txt,通过target_link_libraries链接htcw_bits,CMake会自动传递htcw_bits的包含目录,无需手动添加:
# htcw_io/CMakeLists.txt add_library(htcw_io lib/htcw_io/src/io_stream.cpp) # 引入htcw_bits的CMake配置(若两者在同一项目下) add_subdirectory(../../htcw_bits ${CMAKE_BINARY_DIR}/htcw_bits) # 链接INTERFACE库,PUBLIC关键字确保依赖可传递到上层项目 target_link_libraries(htcw_io PUBLIC htcw_bits) # 仅保留自身的包含目录即可 target_include_directories(htcw_io PUBLIC "${PROJECT_SOURCE_DIR}/lib/htcw_io/include" "${PROJECT_BINARY_DIR}" )
3. 跨项目引用的进阶配置(可选)
如果需要让htcw_bits支持外部项目通过find_package引用,在htcw_bits的CMakeLists.txt中添加安装配置:
# htcw_bits/CMakeLists.txt 新增安装逻辑 install(TARGETS htcw_bits EXPORT htcw_bitsTargets) install(EXPORT htcw_bitsTargets FILE htcw_bitsConfig.cmake DESTINATION lib/cmake/htcw_bits ) install(DIRECTORY include/ DESTINATION include)
外部项目只需调用find_package(htcw_bits),就能通过target_link_libraries直接使用,完全无需手动处理路径。
内容的提问来源于stack exchange,提问作者honey the codewitch
相关产品推荐
相关产品推荐

