本节主要从以下三个方面学习Ubuntu下的编译环境:1、g++编译工程文件;2、cmake编译工程文件;3、kdevelop编译工程文件。
一、g++编译器
1、g++安装
1.先安装 :sudo apt-get install build-essential
build-essential 为Ubuntu源库中提供的软件包,该包依赖许多编译c/c++ 所需要的依赖项,其中就包括 gcc 和g++。也就是说,安装了该软件包,编译c/c++所需要的软件包也都会被安装。
2.查看 gcc 版本 然后安装 统一版本的 g++
如下图,我的电脑安装的是5.4.0版本的gcc,因此安装g++时也要选择5.4.0版本的。
3 安装 g++
终端中输入:sudo apt-get install g++ -5.4.0
安装完成。
2、g++编译简单工程文件
这里以输出一段语句:“HelloSLAM!”为例,新建一个c++源文件,命名为HelloSLAM.cpp,在其中编写如下代码:(编写代码的工具可以用gedit或者是vim)
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
cout<<"hello SLAM!"<<endl;
return 0;
}
完成以后在终端中输入:g++ helloSLAM.cpp
不出意外可以得到a.out这个文件,该文件是一个可执行文件,就像Windows下的.exe一样,在终端中输入:./a.out
将会输出一段字符串“hello SLAM!”
如下图:
上面的执行文件文件名默认为a,若要改为自己想要的名字,可以按以下方式编译
在终端中输入:g++ -o helloSLAM helloSLAM.cpp
效果如下图:
这里我省略了文件后缀名,默认是.out
3、g++编译复杂工程文件
这里使用两个C++源程序来简单说明
新建一个 useHello.cpp 的文件,在其中输入以下代码:
#include "libHelloSLAM.h"
int main(int argc, char** argv)
{
printHello();
return 0;
}
新建另一个 libHelloSLAM.cpp 的文件,在其中输入以下代码:
//这是一个库文件
#include <iostream>
#include "libHelloSLAM.h"
using namespace std;
void printHello()
{
cout<<"Hello SLAM !"<<endl;
}
新建另一个 libHelloSLAM.hpp 的文件,在其中输入以下代码:
#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
void printHello();
#endif
编译方式有两种:
一种是
g++ -c useHello.cpp
g++ -c libHelloSLAM.cpp
g++ -o libHello.out useHello.o libHelloSLAM.o
这种方式先生成两个.o文件,最后再将两个.o文件链接成一个可执行文件,中间文件为 libHelloSLAM.hpp 这个头文件,该文件将libHelloSLAM.cpp 与 useHello.cpp 连接起来,编译时必须保证三个文件都在同一个目录下。
一种是
g++ -o useHello useHello.cpp libHelloSLAM.cpp
这种方式直接将两个.cpp文件链接成一个可执行文件,有个必要条件就是 libHelloSLAM.hpp 这个头文件必须和另外两个.cpp文件都在同一个目录下。
两种方式都可以生成可执行文件,如下图:
可以看出,g++在编译多文件时是有许多不便的,上面只有两个源文件,如果是大型库有几百上千的源文件的时候将会非常麻烦。这就引出另外一种更好的编译器 cmake ,它能完美的解决大型库编译复杂麻烦的问题。
二、cmake编译器
1、cmake安装
在终端中输入:
sudo apt-get install cmake
这种方式安装方便,缺点是如果想要自己交叉编译Android平台的opencv会提示版本太低,因为ubuntu16.04源里的cmake版本只有3.5.1,而Android交叉编译工具链android.toolchain.cmake要求cmake版本最低是3.6.0。不过,我们这里只是先简单学习cmake,这样安装又最方便,就不去官网下载软件包自己解压安装了。等你Ubuntu玩熟以后,如果有项目需要用到高版本的cmake,那时候再重新下一个就是了,相信那时再去下载安装软件包一定非常容易了。
2、cmake编译简单工程文件
示例程序仍以上面的“helloSLAM.cpp”为例,这里我们首先新建一个 CMakeLists.txt 文件,这个文件是cmake编译的必要文件,相当于解释文件,解释你这个工程的编译环境版本、工程名是什么、执行此项工程需要链接哪些库以及输出那种格式的文件(包括.a与.so库文件、.out可执行文件)等等。
使用gedit 或者 vim 打开CMakeLists.txt 文件,在其中编写如下代码:
#声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 2.8)
#声明一个 cmake 工程
project( HelloSLAM )
#添加一个可执行程序
#语法:add_executable(程序名 源代码文件)
add_executable(helloSLAM helloSLAM.cpp)
#add_library(hello_shared SHARED libHelloSLAM.cpp)
#add_executable(useHello useHello.cpp)
#target_link_libraries(useHello hello_shared)
上面那些语法需要遵循cmake的语法编写,最后面三行我注释掉了,它们在后面会有用。
然后,在CMakeLists.txt 文件的同级目录新建一个Build 文件夹用于存放 cmake 编译产生的中间文件,建好后定位到Build ,在终端执行 cmake … 命令,这样将会产生一个Makefile 文件,再执行 make 命令就可以生成我们需要的可执行文件了。具体操作可以看下图:
3、cmake编译复杂工程文件
这里以libHelloSLAM.cpp、libHelloSLAM.hpp、useHello.cpp 这三个文件为例,演示使用cmake 编译带库的工程。
首先使用gedit 或者 vim 打开CMakeLists.txt 文件,在其中做如下修改:
#声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 2.8)
#声明一个 cmake 工程
project( HelloSLAM )
#添加一个可执行程序
#语法:add_executable(程序名 源代码文件)
add_library(hello_shared SHARED libHelloSLAM.cpp)
add_executable(useHello useHello.cpp)
target_link_libraries(useHello hello_shared)
说下那几条指令的作用:
add_library(hello_shared SHARED libHelloSLAM.cpp) //用于生成.so动态库(与Windows下的dll类似)库名为libhello_shared.so
add_executable(useHello useHello.cpp) //用于生成.out可执行文件,文件名为useHello.out(这一步需要调用动态库)
target_link_libraries(useHello hello_shared) //用于将动态库libhello_shared.so链接到可执行文件useHello.out
完成以后如之前编译一样,先执行cmake … 再执行make,就可以生成可执行文件 useHello.out 了。如下图所示:
有人可能不能生成可执行文件,也许会报如下错误:
提示找不到动态库文件,原因是make指令执行时是在 /usr/local/lib 这下面找的动态库,要解决这个问题只需要将你缺少的动态库添加到/lib 文件夹下即可。
这篇简单介绍了如何在Ubuntu下使用工具进行工程的编译操作,希望能和大家一起学习一起进步。