笔记来自高翔的《视觉SLAM十四讲》
备忘
cmake_minimum_required | cmake_minimum_required(VERSION 3.16) | 指定版本 |
project | project(project_name) | 指定工程名称 |
add_library | add_library(lib_name libHelloSLAM.cpp) | 添加需要编译的库,hello是编译后文件名 |
add_executable | add_executable(ext_name helloSLAM.cpp) | 添加需要编译的可执行程序 |
SHARED | add_library(lib_shared_name SHARED lib_hello.cpp) | 编译成共享库 |
target_link_libraries | target_link_libraries(use_ext_name hello_shared) | 关联可执行程序和共享库,该可执行程序使用了共享库 |
CMAKE_BUILD_TYPE | set(CMAKE_BUILD_TYPE "Debug") | 开启debug模式 |
1 cmake编译可执行程序和库文件
可执行程序main.cpp
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
cout << "Hellow" << endl;
return 0;
}
库文件lib_hello.cpp
#include <iostream>
using namespace std;
void printHello()
{
cout << "Hellow" << endl;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(helloSLAM)
add_executable(hellowslam main.cpp) # (生成的文件名 源代码文件)
add_library(lib_hello lib_hello.cpp) # (生成的文件名 源代码文件)生成静态库lib_hello.a
# 生成共享库 使用关键字SHARED
add_library(lib_shared_hello SHARED lib_hello.cpp)
# 静态库每次被调用会生成一个副本,共享库则只有一个副本,更省空间。
注意:没有添加SHARED,则生成静态库,添加则生成共享库。库文件分为共享库和静态库两种,静态库以.a为后缀,共享以.so为后缀。都是一些函数打包的集合,区别在于静态库每次被调用都会生成一个副本,共享库则只有一个副本,更节省空间。
mkdir build
cd build
cmake .. # relation
make # call g++
2 使用编译好的库
上面生成的lib_shared_hello.so库文件是一个二进制压缩包,包含了编译好的二进制函数。为了让其他人调用,则需要提供头文件,只有有了头文件和库文件,则可以调用这个库
头文件lib_hello.h
#ifndef LIBHELLO_H_
#define LIBHELLO_H_
void printHello();
#endif
可执行文件来调用 use_hello.cpp
#include "lib_hello.h"
int main(int argc, char** argv)
{
printHello();
return 0;
}
CMakeLists.txt添加一个可执行程序的生成命令,链接到刚才使用的库上
add_executable(use_hello use_hello.cpp) # 生成可执行文件use_hello
target_link_libraries(use_hello lib_shared_hello) # 可执行文件链接到之前的库hello_shared
如此,生成的可执行文件use_hello,便可以调用lib_shared_hello库中的代码。
./use_hello