首页 > 其他分享 >现代cmake用法

现代cmake用法

时间:2023-04-29 22:33:31浏览次数:40  
标签:biology cmake 用法 现代 模块 头文件 include 目录

目录

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

相关文章

  • Tool-CMake-list
    Tool-CMake-listhttps://www.visgraf.impa.br/seminar/slides/rodlima_cmake_presentation.pdfUsefultomanagelonglistofelementsElementscanbemanipulateddependingonrunningplatformUsefulforsourcefilelistsExample:set(sourcesviewer.cpp......
  • Tool-CMake-Own Finder(-I -L -l)-compiling
    Tool-CMake-OwnFinder(-I-L-l)-compilingWhatisafinderWhencompilingapieceofsoftwarewhichlinkstothird­partylibraries,weneedtoknow:Wheretofindthe.hfiles(­Iingcc)Wheretofindthelibraries(.so/.dll/.lib/.dylib/...)(­Lingcc......
  • Tool-CMake-OPTION
    Tool-CMake-OPTIONhttps://clubjuggler.livejournal.com/138364.htmlincludesacomponentAsanexample,consideraprojectthatoptionallyincludesacomponentthatcommuniatesviaUSBandallowstheuser,atcompiletime,tospecifywhethertoincludeth......
  • c语言中inline用法
    使用inline函数可以提升程序效率,但是让inline函数生效是有条件的...打开Linux内核源代码,会发现内核在定义C语言函数时,有很多都带有“inline”关键字,请看下图,那么这个关键字有什么作用呢? inline关键字的作用在C语言程序开发中,inline一般用于定义函数,inline函数也被称作......
  • Tool-CMake-How CMake simplifies the build process by Bruno Abinader
    Tool-CMake-HowCMakesimplifiesthebuildprocessbyBrunoAbinaderhttps://gitlab.kitware.com/cmake/community/-/wikis/homehttps://brunoabinader.github.io/2009/12/07/how-cmake-simplifies-the-build-process-part-1-basic-build-system/https://brunoabin......
  • python高阶用法汇总——(1)高阶函数
    lambda1defsum(a,b):2returna+b3print(sum(1,5))45lab=lambdaa,b:a+b6print(lab(1,3))1-3行正常用法,5-6lambda用法。lambda:冒号之前的全是参数,即函数括号里面的 sum(a,b)冒号之后的是表达式,即return的结果。lambda只能写在一行。一般情况下,我们不使用......
  • Tool-CMake-A Simple CMake Example
    Tool-CMake-ASimpleCMakeExamplehttps://cmake.org/examples/Therearethreedirectoriesinvolved.Thetopleveldirectoryhastwosubdirectoriescalled./Demoand./Hello.Inthedirectory./Hello,alibraryisbuilt.Inthedirectory./Demo,anexecuta......
  • 语法:neither的用法详解
    neither的用法详解 1.做副词,意为“也不”,此时相当于nor常用结构为:(1)“neither+连系动词be(am,is,are)/助动词(do/does/did)/情态动词(should,will,must,can,couldandsoon)+主语”表示“……也不”此时,可用nor替换,这是一个倒装结构,表示前面否定的情况也同样属于后者......
  • CMakeLists---自定义变量-add_definitions()函数
    转载:https://blog.csdn.net/qq_35699473/article/details/115837708引言其实这个函数在安装一些库的时候,它的CMakeLists里面就有这样的函数。典型的就是opencv了。opencv安装时候有一些指令也是针对这个函数的,比如安装命令(随便搜索的):cmake ../opencv-3.4.1-DWITH_GTK_2......
  • CLion远程调试CMake项目
    cmake项目的远程调试。CLion安装在本地Windows系统,cmake项目部署在远程的Linux系统。配置远程调试可以比较方便地进行Linux端的cmake项目开发。点击setting。主要配置这三个:Toolchains点击+号,添加RemoteHost。然后先点击Credentials的设置按钮,添加远程连接。配置SSHCon......