g++将cpp编译为可执行程序
在Linux中,程序是一个具有执行权限的文件。可以是一个脚本,也可以是一个二进制文件,不过我们不限定它的后缀名(不像Windows指定成exe)
- 我们写一个文本文件
helloSLAM.cpp
- 然后用g++(C++的一个编译器)把它编译成可执行文件
a.out
g++ helloSLAM.cpp
想要指定生成的文件名,用
g++ -o 文件名 helloSLAM.cpp
- 执行可执行程序
./a.out # Linux下./表示运行
使用cmake
- 写CMakeLists.txt
# 声明要求的cmake最低版本
cmake_minimum_required(VERSION 2.8)
# 声明一个cmake工程
project(HelloSLAM)
# 添加一个可执行程序
# 语法:add_executable(程序名 源代码文件)
add_executable(helloSLAM helloSLAM.cpp)
- cmake工程、程序名、源代码文件名可以不同
- 在当前目录下输入
cmake .
- 上述cmake生成了CMakeFiles、CMakeCachetxt、cmake——install.cmake、Makefile
- 注意cmake后的. 表示对在当前目录下进行cmake
CMakeLists告诉cmake要对这个目录下的文件做什么事情。
cmake输出一些编译信息,然后在当前目录生成了一些中间文件,包括xxx.cmake
,xxx.txt
, 最重要的是Makefile
make
- 这一步我们生成了CMakeLists中
add_executable(helloSLAM helloSLAM.cpp)
声明的可执行程序helloSLAM
- 执行
./ helloSLAM
总结:对于一个cpp,我们可以用g++直接编译,也可以先写CMakeLists,然后执行cmake再执行make。——执行cmake的过程处理了工程文件之间关系,执行make实际上调用了g++来编译程序。这样对项目的编译,从输入一串g++指令变成了若干个CMakeLists.txt文件
- 可选地:cmak生成的中间文件不是我们想要留在代码中的
所以我们可以把中间代码放在一个中间目录,编译成功后,把这个中间目录删除
mkdir build
cd build
cmake .. #表示对上一级目录也就是代码所在的文件夹进行编译
make
@tri-seven:~/slambook2/ch2$ mkdir build
@tri-seven:~/slambook2/ch2$ cd build
@tri-seven:~/slambook2/ch2/build$ cmake ..
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile
@tri-seven:~/slambook2/ch2/build$ make
@tri-seven:~/slambook2/ch2/build$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake HelloSLAM Makefile
@tri-seven:~/slambook2/ch2/build$ cd ..
@tri-seven:~/slambook2/ch2$ ls
build CMakeLists.txt helloSLAM.cpp
观察结果,我们发现cmake生成的中间文件
和make生成的可执行程序
都在build文件夹中了。执行build中的可执行程序,确定cpp文件没问题后,如果我们要发布源码,就可以把build文件夹删掉。
注意:LInux中执行命令是 ./
总结
- cmake生成的是中间文件,管理工程文件之间的关系
- make生成可执行文件
cmake生成库和使用库
在一个C++工程中,不是所有代码都会编译成可执行文件。只有带有main函数的文件才会生成可执行程序。而另一些代码,我们只想把它打包成一个东西,供其他程序调用。这个东西叫做 库(Library)。
cmake生成库
Linux中,库文件分为静态库和共享库两种,静态库以.a
作为后缀名,共享库以.so
结尾。所有库都是一些函数打包
后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。
对比CMakeLists.txt中的语句:
add_library(hello libHelloSLAM.cpp) # 生成静态库,得到 `libhello.a`
add_library(hello SHARED libHelloSLAM) # 生成共享库,得到 `libhello.so`
使用库
库文件是个压缩包,里面有编译好的二进制文件
为了让别人用这个库,我们需要提供一个头文件,说明这些库里都有什么。因此,只要拿到了头文件和库文件,就可以调用这个库。
参考该库提供的头文件,以明白调用的格式,同时要把可执行程序链接到库文件上。
完整案例
- 写一个
helloSLAM.cpp
(有main函数) - 用cmake生成可执行程序
helloSLAM
- 写一个
libhelloSLAM.cpp
(无main函数) - cmake一个静态库
hello.a
、一个共享库hello_shared.so
- 写一个
libhelloSLAM.h
- 写一个
usehello.cpp
(有main函数,在main里调用库函数) - cmake一个
调用静态库的usehello
可执行程序 - cmake一个
调用共享库的usehello_shared
可执行程序
Note:
-
在CMakeLIsts里面写的库名称为xxx,实际生成libxxx,后缀视静态库和共享库而定;但是我们在target_link_libraries时,必须写成xxx,而不是libxxx。
-
我们可以先写好.cpp,然后生成库,使用库,链接库也在CMakeLists.txt写好,最后全部一起cmake。
-
CMakeLists里面所有命名不加后缀。
IDE
Clion
进入Clion官网,然后申请教育账号,然后下载toolbox,进入本地Downloads,解压,安装,进入toolbox界面,安装需要的IDE。