这篇文章讲一下cmake怎么处理C++仅标头库,什么叫仅标头库呢,顾名思义,就是只有头文件的程序库。
来看这么一个demo
这个demo里面有demoA和demoB两个项目,其中demoA是一个仅标头库,demoB使用demoA提供的库。
我们知道仅标头库是不能编译成程序目标的,当然用cmake处理也不可能违背这种规则,但是我们一样可以为项目demoA指定一个目标,只是相对于真正的可以编译成文件的程序目标而言,仅标头库的程序目标只是一种概念。
我们来看一下demoA的具体内容
// demoA.hpp
#include <iostream>
void Func()
{
std::cout << "demo" << std::endl;
}
project(demoA)
add_library(${PROJECT_NAME} INTERFACE)
target_include_directories(${PROJECT_NAME} INTERFACE include)
对于仅标头库而言,指令add_library()和target_include_directories()的写法会不一样,需要像上面这个CMakeLists.txt中这么写才可以,另外如果仅标头库需要使用其他的库,在用指令target_link_libraries()设置依赖的库时,设置访问属性也需要用INTERFACE参数。
然后看项目demoB
// main.cpp
#include "demoA.hpp"
int main()
{
Func();
return 0;
}
project(demoB)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE demoA)
可以看到在demoB使用demoA提供的库时,就正常用就可以。
然后是顶层CMakeLists.txt
cmake_minimum_required(VERSION 3.25)
project(demo)
add_subdirectory(demoA)
add_subdirectory(demoB)
这些内容写好之后我们就可以在demo目录下执行命令cmake -B build
生成构建系统了,然后执行命令cmake --build build
构建程序目标就可以了。
可以看到demoA并不会真正构建出程序目标,但是demoB可以正常使用demoA提供的库并且真正构建出程序目标。
标签:demoB,demoA,cmake,C++,add,标头库,include From: https://blog.csdn.net/2401_85919417/article/details/143658784