Cmake 总结
- cmake的目的是为了生成makefile文件,方便对工程的编译
CMakeLists.txt
- 其为描述链接规则的配置文件
- cmake通过CMakeLists.txt来包含相应的头文件,配置生成可执行文件,链接相应的库,并由此生成makefile文件
CMakeLists.txt常用语法
-
CMakeLists.txt通常需要指出该工程所需的最小的cmake版本,否则会出警告
cmake_minimum_required(VERSION 3.11)
-
设置工程名称,
project("test_mnn") #工程名称设置为MNN project("test_mnn" CXX) #除了工程名字设置为MNN,支持C++语言 project("test_mnn" C CXX) #除了工程名字设置为MNN,支持C/C++语言
-
设置变量
set(TARGET_GEN "test_mnn") #将变量TARGET_GEN设置成"test_mnn"
-
包含头文件
include_directories(/usr/include/)
-
生成可执行文件
add_executable(test_mnn ./two.cpp) #生成的可执行文件为test_mnn ,由CMakeLists.txt当前目录下的two.cpp生成
-
链接动态库
target_link_libraries(${TARGET_GEN} PRIVATE libpthread.so librt.so libasound.so libjsoncpp.so)
- 为变量TARGET_GEN链接libpthread.so librt.so libasound.so libjsoncpp.so动态库文件
- PRIVATE 为关键字表示私有的,与此相对应的还有INTERFACE和PUBLIC
- TARGET_GEN为一个变量对于变量的取值方式为${变量},但是在IF变量中直接使用变量名
target_link_libraries(${TARGET_GEN} PRIVATE /home/openailab/T-TEST-MNN/lib/libMNN.a)
- 静态库链接可能有链接不完全的问题,比如MNN的静态库,可以使用下面的方法链接
target_link_libraries(${TARGET_GEN} PRIVATE -Wl,--whole-archive /home/openailab/T-TEST-MNN/lib/libMNN.a -Wl,--no-whole-archive)
-
生成动态库或者静态库
ADD_LIBRARY(test_mnn SHARED ./two.cpp)
- 生成的库名称为libtest_mnn.so
- SHARED,动态库 STATIC,静态库
install
-
一般的流程为先创建build文件,在build文件下进行
mkdir build && cd build && cmake ..
-
在build文件夹下生成makefile,此时可以直接进行编译
make -j16
-
编译完成之后,直接进行安装,默认位置是/usr/local
make install
-
指定安装路径
- 在cmake 时
cmake -DCMAKE_INSTALL_PREFIX=../install ..
- 在安装时
make install DESTDIR=../install