基本概念
cmake是一个编译工具和项目管理工具。
编译一个小程序
water43@water43-GL62M-7RD:~/slambook/ch2$ vim helloSLAM.cpp# includeusing namespace std;int main(int argc,char** argv){cout << "this is slam and cmake text" << endl;return 0;}
在源文件所在的目录下执行
cmake .
可以生成makefile等一系列中间文件,然后在在该目录下执行
make
生成最终的可执行文件。
将中间文件与源文件隔离
按照上面的步骤,我们的源代码将和那些包括Makefiles在内的中间文件混杂在一个目录中,但是为了便于管理,比较常用的方法是这样:
创建一个中间目录:water43@water43-GL62M-7RD:~/slambook/ch2$ mkdir build
在中间目录下执行cmake编译上级目录:
water43@water43-GL62M-7RD:~/slambook/ch2$ cd buildwater43@water43-GL62M-7RD:~/slambook/ch2/build$ cmake ..
这样cmake会根据上级目录的cmakelist进行编译,但是编译的中间文件会放在当前目录下。
最后在当前目录下执行make命令即可使用库文件
- 编写库文件 假设我们要写一个库文件,在该文件中实现一个函数,用于打印一句话,以便主文件调用和链接。
water43@water43-GL62M-7RD:~/slambook/ch2$ vim libHelloSLAM.cpp#includeusing namespace std;void printHello(){cout << "this is a sentence from a library" << endl;}
然后在 CMakeLists.txt中添加这条:
add_library(hello libHelloSLAM.cpp)
再次重复上述的编译过程,可以在build中得到libhello.a这个库文件:
water43@water43-GL62M-7RD:~/slambook/ch2/build$ lsCMakeCache.txt cmake_install.cmake libhello.aCMakeFiles helloSLAM Makefile
*编写头文件
要调用一个库文件,我们要在主函数中引用头文件.在头文件中声明了我们将要使用到的库文件的一些对象.因此,我们还需要手动编写一个头文件. 注意,头文件与库文件的文件名相同,和源文件放在一个目录下.*写一个主函数调用库中的函数
#include#include "libHelloSLAM.h"using namespace std;int main(int argc,char** argv){ cout << "now i will use a library fun" << endl; printHello(); return 0;}
*链接编译
# add linked target 在cmakelist中添加这个链接的对象target_link_libraries(useHello hello_shared)
最后按上述方法添加主函数为可执行文件.
编译成功,DONE!