Cmake构建项目交叉编译:上

目录

1 .cmake简介

2. cmake交叉编译使用方法

3. 交叉编译环境声明文件

4. 文件包含

5. debug及release控制

6. 静态链接及动态链接控制

 7.完整例子

 8. 子目录构建

9. make编译

10. INSTALL

11. make install安装指定依赖文件

12. 通用变量


  • 个人主页:linux_嵌入式大师之路的博客-CSDN博客
  • 十年嵌入式开发经验
  • 欢迎 点赞✍评论⭐收藏
  • 希望本文能对你有所帮助,欢迎在评论区交流讨论!

1 .cmake简介

CMake是一个跨平台的开源构建系统,用于自动化构建和管理项目的编译过程。使用名为CMakeLists.txt的配置文件来描述项目的源代码、编译选项、依赖关系等。CMake可以生成适用于多个编译器和操作系统的构建脚本,它用更抽象的语法来组织项目,目前很多大型项目,如opencv等使用cmake处理,相比makefile,使用起来更简单,且能够跨平台,本次旨在说明交叉编译中需要用到的部分。

2. cmake交叉编译使用方法

cmake ..
DCMAKE_INSTALL_PREFIX:声明编译产物安装路径
DCMAKE_TOOLCHAIN_FILE:声明编译环境
例子:
cmake DCMAKE_TOOLCHAIN_FILE=arm64.cmake DCMAKE_INSTALL_PREFIX=./build ..

3. 交叉编译环境声明文件

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++)

4. 文件包含

include(config/xxx.cmake)

5. debug及release控制

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()

6. 静态链接及动态链接控制

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()

 7.完整例子

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)  //指定依赖库关系

 8. 子目录构建

add_subdirectory(sub) //sub为需要进入的子目录

9. make编译

//未设置以下参数时生成的的可执行文件、库等在当前编译目录下,设置以下变量后make会将
//编译产物安装到指定目录
LIBRARY_OUTPUT_PATH:动态库安装路径
EXECUTABLE_OUTPUT_PATH:执行程序安装路径
CMAKE_ARCHIVE_OUTPUT_DIRECTORY:静态库安装路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY:动态库安装路径
CMAKE_RUNTIME_OUTPUT_DIRECTORY:执行程序安装路径

10. INSTALL

关键字解析:

Cmake构建项目交叉编译:上_第1张图片

#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文件权限。

11. make install安装指定依赖文件

执行make install后才会触发install指令,完成相关文件安装到指定路径。make默认只会将编译产物安装到指定目录

12. 通用变量

  • PROJECT_BINARY_DIR:是CMake生成一系列文件的目录,包括MakeFile等文件,如果你是让他们生成在build目录中就是/home/testProject/build
  • PROJECT_SOURCE_DIR:是顶级的CMakeLists.txt所在的目录,也就是/home/testProject目录

你可能感兴趣的:(linux,c++,系统架构,c语言,嵌入式硬件,linux)