目录
内容来源:这个UP主课讲的很好小彭老师cmake课程
自己写代码使用方法
推荐使用这样的目录结构
include目录下要套一层目录是为了在使用时避免同名头文件冲突
源码组织格式
项目模块名称
模块名称/include/模块名称/头文件.h
模块名称/src/源文件.cpp
- 模块
CMakeLists.txt
中写 target_include_directories(模块名称 PUBLIC include)
源文件中写
#include<模块名称/头文件.h>
//如上图中
#include<biology/Animal.h>
项目的顶层CMake可以使用add_subdirectory
将子目录加入进来,他就会执行目录下的cmakelist
project(projname LANGUAGES CXX)
add_subdirectory( biology )
add_subdirectory( pybmain)
顶层写了版本,编译选项,下层就不用写了
下层CMake
file(GLOB_RECURSE srcs CONGIFURE_DEPENDS src/*.cpp include/*.h)
add_library(biology STATIC ${srcs})
#为项目包含头文件
target_include_directories(biology PUBLIC include)
cmake关键字
file(GLOB)
:只能找到当前目录flie(GLOB_RECURSE)
:会查找子目录CONGIFURE_DEPENDS
:为了每次添加了新的头文件和源文件都自动更新- cmake工作目录在自身所在的目录下,所以
include
当前目录下的include目录就可以了
public
具有传染性
biology 目录下的cmake文件
file(GLOB_RECURSE srcs CONGIFURE_DEPENDS src/*.cpp include/*.h)
add_library(biology STATIC ${srcs})
#为项目包含头文件
target_include_directories(biology PUBLIC include)
pybmain目录下的cmake文件
file(GLOB_RECURSE srcs CONGIFURE_DEPENDS src/*.cpp include/*.h)
add_library(pybmain STATIC ${srcs})
#为项目包含头文件
target_include_directories(pybmain PUBLIC include)
#链接biology库
target_link_libraries(pybmain PUBLIC biology)
可以看到pybmain
引用了biogloy
模块,但是由于所有的include
都是PUBLIC
,所以在pybmain目录下的源文件可以引用biogloy
下的头文件,即使pybmain
下的cmake
没有target_include_directories(biology头文件目录)
,这个模块依然有biology
的头文件搜索目录
建议
- 申明和实现尽量分开,且文件名尽量一致,如果有时候不得不将实现写在头文件中,(非成员函数)注意加
static
或者inline
关键字 - 注意尽量使用
include<>
而不是include " "
- 如果你的代码依赖其他模块,则尽量可以使用
前向声明
,然后在源文件中引入模块的头文件,示例如下
前向声明
适用于这种在头文件中只需要使用到类指针,而无需使用其内部结构的情况,加快编译速度,防治循环引用
//头文件
#include<string>
class Animal;
class Dog{
public:
std::string care(Animal *a)const;
};
//源文件
#include<biology/Animal.h>
std::string Dog::care(Animal *a)const{
/* your code */
}
引用第三方库/依赖
find_package用法
#找不到就找不到无所谓
find_package(OpenCV)
#找不到就报错
find_package(OpenCV REQUIRED)
#找不到报错,且必须有OpenCV::core和OpenCV::video两个模块
find_package(OpenCV COMPONETS core video)
- find_package找的实际上是
OpenCVConfig.cmake
文件,也可以是OpenCV-config.cmake
文件,一般来说,对cmake支持有好的库安装目录下都有这个文件 - 同理,find_package(Qt5) 找的就是
Qt5Config.cmake
- 总结,就是包名+Config.cmake文件
非默认安装路径
假如说你的库没有安装在默认路径下,那么find_package就不能直接写了
这个时候就需要自己设置目录了,比如
set(Qt5_DIR "/opt/Qt5/gcc/lib/cmake/Qt5")
或者自己设置环境变量
标签:biology,cmake,用法,现代,模块,头文件,include,目录 From: https://www.cnblogs.com/Lhh-9999/p/17364577.html