一,使用带main的正常cpp编译
1,创建一个cpp,HelloSLAM.cpp
#include<iostream>
using namespace std;
int main()
{
cout << "hello slam" << endl;
return 0;
}
2,然后在HelloSLAM.cpp相同目录下编写CMakeLists.txt,内容如下:
cmake_minimum_required (VERSION 2.8)
project (HelloSLAM)
add_executable(HelloSLAM HelloSLAM.cpp)
3,创建文件夹build,并进行编译
mkdir build
cd build
cmake ..
make
4,执行可执行程序
./HelloSLAM
二,linux下编译库的使用
在一个C++的工程中,并不是所有的代码都会编译成可执行文件,只有带有main函数的文件才会生成可执行程序。而另外有一些代码,我们只想把他打包成一个东西,供其他程序的调用,这个东西叫库。库文件是一个压缩包,里面是编译好的二进制函数。
2.1 静态库的生成(.a)
1,创建一个.cpp文件,名字叫做libtest.cpp.它没有main函数,意味着这个库没有可执行文件
#include<iostream>
using namespace std;
void printHello( )
{
cout << "hello slam" << endl;
}
2,编辑CMakeLists.txt文件
cmake_minimum_required (VERSION 2.8)
project (libtest)
add_library(libtest libtest.cpp)
3,执行以下语句
mkdir build
cd build
cmake ..
make
4,这样会在build文件夹下,生成一个.a的静态库
2.2 共享库的创建(.so)
共享库和静态库的区别,静态库每次调用都会生成一个副本,共享库只生成一个副本。在空间节省的状况下,还是使用共享库
和上面的区别,体现在cmake的编译文件CMakeLists.txt的内容中
cmake_minimum_required (VERSION 2.8)
project (libtest)
add_library(libtest SHARED libtest.cpp)
三,库文件的调用
库文件是一个压缩包,里面是编译好的二进制函数。只看这个并不知道里面函数的功能,调用的形式是什么,为了让别人调用该函数我们需要提供一个头文件,让别人知道应该如何使用这个库。这样只要拿到这个头文件,就可以知道如何调用。
1,创建头文件,指明共享库中函数的功能libtest.h
#ifndef LIBTEST_H_
#define LIBTEST_H_
void printHello();
#endif
2,创建调用cpp,uselibtest.cpp
#include"libtest.h"
int main()
{
printHello();
return 0;
}
3,创建CMakeLists.txt文件
cmake_minimum_required (VERSION 2.8)
project (libtest)
add_library(libtest SHARED libtest.cpp)
add_executable(uselibtest uselibtest.cpp)
target_link_libraries(uselibtest libtest)
将上面的文件,和libtest.cpp.放在同一级的目录
4,执行以下语句进行编译
mkdir build
cd build
cmake ..
make
执行后的结果,如图所示:
5.调用执行
./uselibtest
执行的结果如图所示: