前言
学了一天半,学到t3的时候发现px4固件的makefile好像是手写的,Σ( ° △ °|||)︴,不过《CMAKE practice很好,既然学了就学完总结下了,
t1太简单了,就直接讲t2工程的建立和t3如何构建共享库(静态库和动态库)以及t4调用动态库
t2 构建工程的建立
- 为工程添加一个目录src,放置源代码
- 添加一个子目录,用来放置工程的文档hello.txt
- 添加文本文件COPYRIGHT,README;
- 添加一个runhello.sh,调用二进制编译文件
- 构建后的目标文件放入构建目录的bin目录
- 最近安装文件:将hello二进制与runhello.sh 安装至/usr/bin,讲doc目录的内容及COPYRIGHT/README安装到/usr/share/doc/cmake/t2
其中1,2,3,4在我没有学cmake之前就会了
mkdir src
mkdir doc
cd doc
touch readhello.txt
cd ..
touch COPYRIGHT README
vim runhello.sh
add:./hello
:wq
看教程:
- 创建主工程目录的CMakeLists.txt
需要注意的是:CMakeLists.txt 文件名必须区分大小写,但是里面的内容关键字不区分大小写,但建议大写
# 工程名,其会隐试定义两个变量值 PROJECT_SOURE_DIR
# PROJECT_BINARY_DIR
PROJECT(hello)
ADD_SUBDIRECTORIES(src bin)
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
其中参数[EXCLUDE_FROM_ALL]:将这个目录从编译过程中排除,比如什么example,example可能是需要先构建完工程,在进行单独编译。
2. 创建代码文件
cd src
vim main.c()
add:
#include<stdio.h>
int main()
{
printf("hello world \n");
return 0
}
:wq
添加CMakeLists.txt
ADD_EXECUTABLE(hello main.c)
- 换个地方保存二进制文件
这个地方就要用到刚才隐试定义的两个参数PROJECT_BINARY_DIR,PRO_SOURCE_DIR,发现前者是运行CMAKE的文件夹,后者是工程目录,换个地方保存二进制就需要用到这个参数
SET(EXECTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
不过我们前面定义过ADD_SUBDIRECTORIES,
这条命令在哪个CMakeLists.txt中写呢,答案是哪里ADD_EXECTUABLE就在哪里写了
不过我们之前写的ADD_SUBDIRECTORIES(SOURECE_DIR,BINARY_DIR)是有效的,我发现不写上面的代码依然能够在build/bin出现二进制文件,但是如果使用上面代码可以在build下指定一个文件夹只放二进制文件,如果一起写的话就是会让二进制文件放在指定文件中,但是如果指定的输出文件也是bin那这条指令就失效了。 - 如何安装
这是我觉得最酷的地方了
需要用到INSTALL指令,安装的内容可以包括目标二进制、动态库、静态库及文件和脚本目录
程序安装
INSTALL(TARGET target ...
[[ARCHIVE|LIBRARY|RUNTIME]] # 静态库 动态库 二进制文件
[DESTINATION] <dir>) #安装文件夹必须用相对路径
....
普通文件安装
INSTALL(FIELS files ... DESTINATION <dir>)
非目标文件的安装(比如脚本)
INSTALL(PROGRAMS files... DESTINATION <dir>)
其中DETINATION “<、dir>” 都是安装的相对路径
目录的安装:
INSTALL(DIRECTORIES dirs ... DESTINATION <dir>)
安装CMAKE脚本执行(xxx.cmake)
INSTALL([[SCRIPT <file>] [CODE <code>]] [...])
这个命令没用也没看懂
其中还有些参数没有列出,以后深入的时候在学习。
主工程目录的CMakeLists.txt
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
MESSAGE(STATUS "BINARY_DIR:${PROJECT_BINARY_DIR}")
MESSAGE(STATUS "SOURCE_DIR:${PROJECT_SOURCE_DIR}")
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)
#INSTALL(TARGETS hello RUNTIME DESTINATION bin)
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/t2)
/src/CMakeLists.txt
SET(SRC_LIST main.c)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # this is invaild commander
ADD_EXECUTABLE(hello ${SRC_LIST})
INSTALL(TARGETS hello RUNTIME DESTINATION bin)
编译命令
CMAKE -DCMAKE_INSTALL_PREFIX=<path>
如果没有-DCMAKE_INSTALL_PREFIX直接make install 我没有试过,但是作者说默认是/usr/local
完了,收益匪浅,感谢《CMAKE practice》