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 變量,指定生成的可執行文件(目標二進制文件)的位置