CMake Tutorial:https://cmake.org/cmake/help/latest/guide/tutorial/index.html
CMake 社区:https://discourse.cmake.org/
CMake wiki:https://gitlab.kitware.com/cmake/community/-/wikis/home
CMake 实践:http://file.ncnynl.com/ros/CMake%20Practice.pdf
CMake 如何入门 知乎:https://www.zhihu.com/question/58949190/answer/161788340
CMakeLists.txt 语法介绍与实例演练:https://blog.csdn.net/afei__/article/details/81201039
Linux 编译工具 gcc/g++、Make/Makefile、CMake/CMakeLists.txt、qmake:https://www.cnblogs.com/dinghongkai/p/11316528.html
makefile介绍:https://seisman.github.io/how-to-write-makefile/introduction.html
上手例子
https://github.com/ttroy50/cmake-examples
https://github.com/SFUMECJF/cmake-examples-Chinese
cmake是什么?
写c++代码时候,从源代码到可执行程序,需要经历三个阶段:编写源码 -> 源码编译 -> 链接;
在linux系统上开发程序,通常用g++进行编译&链接,对于简单的项目,直接调用g++是可行的,对于复杂的项目,则需要通过Make(通过Makefile调用g++实现编译)进行批处理,然而写Makefile比较麻烦,所以可以通过CMake工具,依据CMakeLists.txt生成Makefile。
CMake 是跨平台编译工具,依据规则文件 CMakeLists.txt 生成 Makefile。
GCC/G++ 一般用于单个源文件的编译,当一个工程有多个源文件时,再用 GCC/G++ 逐个编译效率太低,所以出现 make 工具。
Make 相当于一个批处理命令,本身没有编译功能,通过 makefile 规则文件调用 GCC/G++ 或其他命令来编译和链接。当工程较大时,手写 makefile 比较麻烦;且在不同平台下编译时,需重新修改 makefile 文件,十分麻烦,因而 CMake 应运而生。
CMake 是一个跨平台的编译工具,通过规则文件 CMakeLists.txt 生成 Makefile 文件,CMakeLists.txt 文件需要自己去写。
cmake能做什么?
用户可以避免直接写Makefile,转而写更简单的CMakeLists.txt,来帮助我们对大型项目进行编译管理。
外部编译方式
cmake推荐使用外部编译方式,需要先在目录hello下新建一个目录build(也可以是其他任何目录名),然后执行以下步骤
mkdir src # 源代码路径,包含CMakeLists.txt文件 cd src && mkdir build cd build cmake .. make # 编译链接,生成可执行文件;或者make -j, make -j install (前提Makefile有对应install)
以hello world为例
#includeusing namespace std; int main(){ cout << "hello world" < 文件组织形式如下:
hello/ |– CMakeLists.txt |– build / |– hello.cccmake还可以直接在当前目录进行编译,无须建立build目录。但是,这种做法会将所有生成的中间文件和源代码混在一起,而且cmake生成的makefile无法跟踪所有的中间文件,即无法使用”make clean; make distclean”命令将所有的中间文件删除。因此,我们推荐建立build目录进行编译,所有的中间文件都会生成在build目录下,需要删除时直接清空该目录即可。这就是所谓的外部编译方式。
cmake语法
CMake 支持大写、小写和大小写混合命令
常见命令
cmake_minimum_required(VERSION 3.10) # cmake版本号 # set the project name and version project(Tutorial VERSION 1.0) # specify the C++ standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) # 该指令的作用为将目标文件与库文件进行链接, 可直接使用库文件的相对路径或绝对路径 #是指通过add_executable()和add_library()指令生成已经创建的目标文件 target_link_libraries(undistort B.a C.so ${OpenCV_LIBS}) # 将指定的源文件生成链接文件,然后添加到工程中去, # 比如add_library(undist, src/main.cpp, src/undistort.cpp) 库可以包含多个文件 add_library( [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2] [...]) add_library(common STATIC util.cpp) # 生成静态库 add_library(common SHARED util.cpp) # 生成动态库或共享库 add_executable(demo demo.cpp) # 生成可执行文件 # add_library 默认生成是静态库,通过以上命令生成文件名字, # 在 Linux 下是: # demo # libcommon.a # libcommon.so set(SRC_LIST main.cpp) # set 直接设置变量的值 set(SRC_LIST ${SRC_LIST} test.cpp) # set 追加设置变量的值 add_executable(demo ${SRC_LIST}) # 生成可执行文件 # 指定要链接的库文件的路径 link_directories(path) aux_source_directory(dir VAR) # 发现一个目录下所有的源代码文件并将列表存储在一个变量中。 aux_source_directory(. SRC_LIST) # 搜索当前目录下的所有.cpp文件 其他
查看opencv安装pkg-config opencv --modversion



