2.16CMakeLists学习笔记.md

摘要

![docker](./image1/docker01.png)
  • CMakeLists中add_executable(可执行文件, src1,src2,src3…)

linux查看gcc/cmake/当前版本的方法为:

1
2
3
cmake --version
g++ version
gcc --version

g++ 和 gcc 的区别

  • gcc是GCC中的GUN C Compiler(C 编译器)
  • g是GCC中的GUN C Compiler(C++编译器)

gcc和g++的主要区别

  1. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)

  2. 对于 .c和.cpp文件,g++则统一当做cpp文件编译

  3. 使用g编译文件时,g会自动链接标准库STL,而gcc不会自动链接STL

  4. gcc在编译C文件时,可使用的预定义宏是比较少的

  5. gcc在编译cpp文件时/g在编译c文件和cpp文件时(这时候gcc和g调用的都是cpp文件的编译器),会加入一些额外的宏。

6.在用gcc编译c文件时,为了能够使用STL,需要加参数 –lstdc ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个。

cmake g++ gcc

cmake 是一个跨平台的安装(编译)工具,他允许开发者编写一种平台无关的CMakelists.txt文件来定制整个编译流程,然后在根据目标用户的平台进一步生成所需要的本地化makefile和工程文件,如unix的makefile或者windows的visual studio工程。

cmake 和make的区别

当只有一个源文件时,可以直接使用gcc来编译,当你的程序存在多个源程序时,用gcc逐个去编译他就会很麻烦,所以出现了make工具,make工具可以看成是一个智能的批处理工具,它本身没有编译和链接功能,而是用类似于批处理的功能,通过cmake生成的makefile文件来来指定用户的命令来进行编译和链接的。

makefile像乐谱,make像演奏家。但是当项目非常大时,手写makefile文件也很麻烦,这时候就出现了cmake工具,cmake工具可以更加简单的生成makefile文件,供make用。当然cmake还有其他功能,可以跨平台生成对应平台能用的makefile,而不用自己取修改makefile。

cmake可以生成makefile但是,cmake是根据CMakeLists.txt文件来生成makefile文件的。最后CmakeLists.txt是由谁生成的呢,答案是你自己手写的。

总结cmake和make的区别:

  • gcc

    gcc可以对文件进行编译但是文件多了就变得不方便,所以有make和cmake。

  • make

make是根据makefile生成可执行文件,执行编译和链接的功能,注意其本身更没有编译和链接功能,但是却可以根据makefile文件来编译和链接;

  • cmake

cmake是根据CMakeLists.txt来生成makefile文件的。


例如:

存在一个源文件:

1
hello.c

需要生成可执行文件:

1
hello

需要执行:

1
gcc hello.c -o hello

如果将上面的命令写在一个文件中,这个文件就是makefile文件,执行make就会执行makefile中的所有命令。

cmake是用来生成makefile文件的,生成makefile文件的工具还有autotools和qmake。

基础语法

  • 1.1

https://www.hahack.com/codes/cmake/

  • 1.2 cmake_minimum_required(VERSION 2.6)

  • 1.3 project(build_observe)

project 不是强制性的,但是建议都加上

  • 1.4 CMakeLists中add_executable(可执行文件, src1,src2,src3…)

在add_executable语句中,src为构成可执行文件的所有源文件列表,需要将构成可执行文件的所有源文件都添加进去。

1
2
3
4
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])

REQUIRED: 加上后如果没有发现package时,将会停止并且会弹出一个错误。

_FOUND 将会指示package是否找到,如果被找到,_FOUND为真。

例如opencv的例子(packageName=OpenCV)

1
2
3
4
5
6
find_package(OpenCV REQUIRED  core highgui imgproc imgcodecs)
if(OpenCV_FOUND)
messege("Yes")
else()
messege("No")
endif()
文章目录
  1. 1. 摘要
    1. 1.0.1. linux查看gcc/cmake/当前版本的方法为:
    2. 1.0.2. g++ 和 gcc 的区别
      1. 1.0.2.1. gcc和g++的主要区别
    3. 1.0.3. cmake g++ gcc
    4. 1.0.4. cmake 和make的区别
  2. 1.1. 基础语法
|