02 外部构建以及安装 CMake
任务目标
- 外部构建 CMake
- 安装 CMake
一、外部构建 CMake 的 HelloWorld
① 进入 /home/lql/cmake 目录
cd /home/lql/cmake
新建并进入 t2 工作目录
mkdir t2 && cd t2
② 新建并进入 src 目录(用于存放源代码 main.c 和 src 目录相应的 CMakeLists.txt)
mkdir src && cd src
新建 main.c 到刚创建的 src 目录
vim main.c
输入内容:
#include <stdio.h>
int main() {
printf("Hello World from t2 Main!\n");
return 0;
}
新建 CMakeLists.txt
vim CMakeLists.txt
输入内容:
ADD_EXECUTABLE(hello main.c)
③ 在主工程目录(/home/lql/cmake/t2)下,新建 CMakeLists.txt
vim CMakeLists.txt
输入内容:
cmake_minimum_required(VERSION 3.10)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin) // 解释见下方 "指令解释"
④ 新建并进入 build 目录
mkdir build && cd build
⑤ 外部构建
cmake ..
make
二、安装
经过安装后生成的可执行二进制,可以在任何目录下直接调用可执行文件名,对应要操作的文件是 Makefile
- 方式一:从代码编译后直接 make install 安装
- 方式二:打包时的指定目录安装
方式一:从代码编译后直接 make install 安装
进入可执行文件目录(主工程目录:/home/lql/cmake/t2)
cd /home/lql/cmake/t2/build/bin
删除或重命名已有的 MakeFile 文件,编写自己的 MakeFile
DESTDIR=
install:
mkdir -p ${DESTDIR}/usr/bin
install -m 755 hello ${DESTDIR}/usr/bin
先不用管参数都是什么意思,后面会讲到,但是文件大致作用是 mkdir 创建一个目录,然后 install 安装可执行文件 hello
先安装试一把
make install
查看安装目录 /usr/bin
指定 Makefile 安装生成目录
make install DESTDIR=/home/lql
定义前缀 PREFIX
改写 Makefile
DESTDIR=
PREFIX=usr
install:
// {} 也可以换成 ()
mkdir -p ${DESTDIR}/${PREFIX}/bin
install -m 755 hello ${DESTDIR}/${PREFIX}/bin
方式二:打包时的指定目录安装
进入可执行文件目录(主工程目录:/home/lql/cmake/t2)
cd /home/lql/cmake/t2
加点东西,搞得正规一点
添加 doc 目录及文件
mkdir doc
cd doc
vim hello.txt
// 随便写点内容保存后退出
在主工程目录添加 runhello.sh 脚本,内容:hello
vim runhello.sh
// 内容:hello
在主工程目录添加 COPYRIGHT 和 README
touch COPYRIGHT
touch README
修改主工程目录下的文件 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
# 添加如下内容
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2) // 安装 COPYRIGHT、README 文件(FILES)到 share/doc/cmake/t2
INSTALL(PROGRAMS runhello.sh DESTINATION bin) // 安装 runhello.sh 脚本(PROGRAMS)到 bing
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/t2) // 安装 doc 中的内容(DIRECTORY)到 share/doc/cmake/t2
安装可执行文件 hello
修改 src 下的 CMakeLists.txt
ADD_EXECUTABLE(hello main.c)
# 添加如下内容
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) // 指定可执行文件 hello(目标二进制文件)的生成位置,默认就在 build/bin,由 ADD_SUBDIRECTORY 指令指定,详见下方 "指令解释"
INSTALL(TARGETS hello RUNTIME DESTINATION bin) // 安装可执行文件 hello
进入 build 目录,进行外部构建
cmake -DCMAKE_INSTALL_PREFIX=/home/lql/usr ..
make
make install
查看安装目录(/home/lql/usr)
三、指令解释
① ADD_SUBDIRECTORY
# source_dir:源文件所在目录
# binary_dir:中间二进制文件和目标二进制文件存放目录
# EXCLUDE_FROM_ALL:将所指定的目录从编译过程中排除
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
② SET
# 上面 ADD_SUBDIRECTORY 指令的 binary_dir 和 下面 SET 的 path 可同可不同,都可行
# 上面 ADD_SUBDIRECTORY 指令的 binary_dir 和 下面 SET 的 path 是相对路径,貌似在哪执行 cmake 命令相对的就是哪个目录
# 指定生成的可执行文件(目标二进制文件)的位置
SET(EXECUTABLE_OUTPUT_PATH <path>)
小结
- CMAKE_INSTALL_PREFIX 变量,外部编译指定安装目录
- ADD_SUBDIRECTORY 指令,指定中间二进制文件和目标二进制文件存放目录
- EXECUTABLE_OUTPUT_PATH 变量,指定生成的可执行文件(目标二进制文件)的位置