目录
1 .cmake简介
2. cmake交叉编译使用方法
3. 交叉编译环境声明文件
4. 文件包含
5. debug及release控制
6. 静态链接及动态链接控制
7.完整例子
8. 子目录构建
9. make编译
10. INSTALL
11. make install安装指定依赖文件
12. 通用变量
CMake是一个跨平台的开源构建系统,用于自动化构建和管理项目的编译过程。使用名为CMakeLists.txt的配置文件来描述项目的源代码、编译选项、依赖关系等。CMake可以生成适用于多个编译器和操作系统的构建脚本,它用更抽象的语法来组织项目,目前很多大型项目,如opencv等使用cmake处理,相比makefile,使用起来更简单,且能够跨平台,本次旨在说明交叉编译中需要用到的部分。
cmake ..
DCMAKE_INSTALL_PREFIX:声明编译产物安装路径
DCMAKE_TOOLCHAIN_FILE:声明编译环境
例子:
cmake DCMAKE_TOOLCHAIN_FILE=arm64.cmake DCMAKE_INSTALL_PREFIX=./build ..
arm64.cmake:
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm64)
#声明工具交叉编译工具链
set(tools ${PROJECT_SOURCE_DIR}/prebuilts/)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)
include(config/xxx.cmake)
if ("${MODE}" STREQUAL "debug")
list(APPEND CMAKE_C_FLAGS "-g -O0 -fPIC ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -DEBUG -g -O0 -fPIC")
else ()
list(APPEND CMAKE_C_FLAGS "-fPIC ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC")
endif()
if ("${MODE}" STREQUAL "debug")
list(APPEND CMAKE_C_FLAGS "-g -O0 -fPIC ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -DEBUG -g -O0 -fPIC")
else ()
list(APPEND CMAKE_C_FLAGS "-fPIC ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC")
endif()
cmake_minimum_required (VERSION 3.9.0 FATAL_ERROR) //指定项目所需的最低Cmake版本
project(test) //项目名称
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -DEBUG -ggdb -Wall -Wno-unused -O0 -fPIC")
//指定外部库链接目录
link_directories(
xxx/
)
//指定外部头文件目录
include_directories(
xxx/
)
aux_source_directory(./main.cpp SOURCE_FILES)
add_executable(${PROJECT_NAME} ${SOURCE_FILES}) //指定编译的源文件
target_link_libraries(${PROJECT_NAME} pthread) //指定依赖库关系
add_subdirectory(sub) //sub为需要进入的子目录
//未设置以下参数时生成的的可执行文件、库等在当前编译目录下,设置以下变量后make会将
//编译产物安装到指定目录
LIBRARY_OUTPUT_PATH:动态库安装路径
EXECUTABLE_OUTPUT_PATH:执行程序安装路径
CMAKE_ARCHIVE_OUTPUT_DIRECTORY:静态库安装路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY:动态库安装路径
CMAKE_RUNTIME_OUTPUT_DIRECTORY:执行程序安装路径
关键字解析:
#INSTALL实现外部依赖库以及脚本的安装
INSTALL(TARGETS testrun testlib teststaticlib
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)DESTINATION:指定磁盘上要安装文件的目录
-DCMAKE_INSTALL_PREFIX:指定cmake变量的地址前缀,如CMAKE_INSTALL_BINDIR、
CMAKE_INSTALL_INCLUDEDIR、CMAKE_INSTALL_LIBDIR等等。
CMAKE_INSTALL_BINDIR:
/*编译时二进制文件的安装目录,-DCMAKE_INSTALL_PREFIX指定的地址前缀+bin/ */
CMAKE_INSTALL_INCLUDEDIR:
/*编译时头文件的安装目录,-DCMAKE_INSTALL_PREFIX指定的地址前缀+include/ */
CMAKE_INSTALL_LIBDIR:
/*编译时库文件的安装目录,-DCMAKE_INSTALL_PREFIX指定的地址前缀+lib/ */上面的例子会将:可执行二进制testrun 安装到${CMAKE_INSTALL_BINDIR}目录,动态库 libtestlib .so安装到${CMAKE_INSTALL_LIBDIR}目录,静态库libteststaticlib.a安装到${CMAKE_INSTALL_LIBDIR}目录。
该命令的其他一些参数的含义:
DESTINATION:指定磁盘上要安装文件的目录;
PERMISSIONS:指定安装文件的权限。有效权限是OWNER_READ,OWNER_WRITE,OWNER_EXECUTE,GROUP_READ,GROUP_WRITE,GROUP_EXECUTE,WORLD_READ,WORLD_WRITE,WORLD_EXECUTE,SETUID和SETGID;
CONFIGURATIONS:指定安装规则适用的构建配置列表(DEBUG或RELEASE等);
EXCLUDE_FROM_ALL:指定该文件从完整安装中排除,仅作为特定于组件的安装的一部分进行安装;
OPTIONAL:如果要安装的文件不存在,则指定不是错误。
//例子:
install(DIRECTORY libtest/ DESTINATION ${LIBRARY_OUTPUT_PATH})
install(FILES ./test DESTINATION ${EXECUTABLE_OUTPUT_PATH})
install(PROGRAMS./run.sh DESTINATION ${EXECUTABLE_OUTPUT_PATH})FILES|PROGRAMS若为相对路径给出的文件名,将相对于当前源目录进行解释。其中,FILES为普通的文本文件,PROGRAMS指的是非目标文件的可执行程序(如脚本文件)。
如果未提供PERMISSIONS参数,默认情况下,普通的文本文件将具有OWNER_WRITE,OWNER_READ,GROUP_READ和WORLD_READ权限,即644权限;而非目标文件的可执行程序将具有OWNER_EXECUTE, GROUP_EXECUTE,和WORLD_EXECUTE,即755权限。
//大多数时候我们想保持源文件权限,而不是默认644权限
install(DIRECTORY ./test/ DESTINATION ${EXECUTABLE_OUTPUT_PATH}
USE_SOURCE_PERMISSIONS)NO_SOURCE_PERMISSIONS:是cmake 3.19版本之后新添加的,主要意思是output文件不采用input的文件权限,使用默认标准权限为644(-rw-r--r-);
USE_SOURCE_PERMISSIONS: 是cmake 3.20新添加的,主要是output文件采用源文件input的文件权限,默认是采用源文件权限。
FILE_PERMISSIONS: cmake 3.20之后新添加功能,主要是指定输出的output文件权限。
执行make install后才会触发install指令,完成相关文件安装到指定路径。make默认只会将编译产物安装到指定目录
- PROJECT_BINARY_DIR:是CMake生成一系列文件的目录,包括MakeFile等文件,如果你是让他们生成在build目录中就是/home/testProject/build
- PROJECT_SOURCE_DIR:是顶级的CMakeLists.txt所在的目录,也就是/home/testProject目录