You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:41:21