如何创建CMake接口库(仅头文件库)并在其他项目中链接?
CMake接口库(仅头文件库)创建与链接问题解答
问题1:如何不使用相对路径包含print.hpp
要实现直接用#include "print.hpp"而非相对路径引用,需在printer库的CMake配置中声明头文件搜索路径。修改printer目录下的CMakeLists.txt,在add_library后添加头文件目录配置:
cmake_minimum_required(VERSION 3.0.0) project(printer VERSION 0.1.0) include(CTest) enable_testing() add_library(printer INTERFACE print.hpp print.inl) # 新增:将printer所在目录设为接口包含目录,链接该库的项目可直接引用头文件 target_include_directories(printer INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(printer PROPERTIES CXX_STANDARD 20) set_target_properties(printer PROPERTIES LINKER_LANGUAGE CXX) set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack)
接着修改print_app的main.cpp,替换相对路径引用:
#include <iostream> #include "print.hpp" // 无需相对路径,直接引用 int main() { std::cout << "Hello, world!" << std::endl; print(10); print("abc"); print(1.23456789); }
问题2:print_app生成的Makefile中未提及printer库
这是INTERFACE库的正常特性,但你的CMake配置存在一处错误:
printer是仅头文件的INTERFACE库,没有编译生成的二进制库文件(如.a/.so),因此CMake不会在Makefile中生成针对它的链接命令,只会传递它的接口属性(如头文件目录、编译标准)给依赖目标。- 你当前
target_link_libraries使用了INTERFACE关键字,这不符合可执行文件的依赖规则,应改为PRIVATE(或PUBLIC,此处PRIVATE足够)。
修改print_app目录下的CMakeLists.txt:
cmake_minimum_required(VERSION 3.0.0) project(print_app VERSION 0.1.0 LANGUAGES CXX) include(CTest) enable_testing() add_executable(print_app main.cpp ) set_target_properties(print_app PROPERTIES CXX_STANDARD 20) # 修正关键字:INTERFACE改为PRIVATE target_link_libraries(print_app PRIVATE printer) set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack)
修改完成后,CMake会自动将printer的接口属性应用到print_app上,虽Makefile中看不到printer的名字,但所有依赖配置已生效。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

