现代cmake教程-基础

内容来源:这个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")

或者自己设置环境变量

posted @ 2023-04-29 22:23  DaoDao777999  阅读(72)  评论(0编辑  收藏  举报