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