CMake交叉编译配置实例

这篇具有很好参考价值的文章主要介绍了CMake交叉编译配置实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文件目录

├── main.c  
├── inc   
│ 	└── fun.h   
└── src   
	└── fun.c        

本地编译

cmake_minimum_required(VERSION 3.0.0)
project(my_test VERSION 0.1.0)

include(CTest)
enable_testing()

#设置编译工具链
set(TOOLCHAIN_DIR /usr)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/g++)

#设置编译的版本为debug版本。如果要编译realse版本,直接写realse即可
set(CMAKE_BUILD_TYPE Debug)

include_directories(${PROJECT_SOURCE_DIR}/inc)
aux_source_directory(./src SRC_LIST)
aux_source_directory(. SRC_LIST)
add_executable(my_test ${SRC_LIST})
set(EXECUTABLE_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/bin)#设置输出文件

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

交叉编译设置

cmake_minimum_required(VERSION 3.0.0)
project(my_test VERSION 0.1.0)

include(CTest)
enable_testing()

#设置编译工具链
set(TOOLCHAIN_DIR /opt/phytec-yogurt/BSP-Yocto-AM335x-PD19.1.1/sysroots/x86_64-phytecsdk-linux/usr/bin/arm-phytec-linux-gnueabi)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/arm-phytec-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/arm-phytec-linux-gnueabi-g++)
set(ARM_SYSROOT /opt/phytec-yogurt/BSP-Yocto-AM335x-PD19.1.1/sysroots/cortexa8hf-neon-phytec-linux-gnueabi)
#指定交叉编译环境的目录
set(CMAKE_FIND_ROOT_PATH "${ARM_SYSROOT}")
#从来不在指定目录(交叉编译)下查找工具程序。(编译时利用的是宿主的工具)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#只在指定目录(交叉编译)下查找库文件
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#只在指定目录(交叉编译)下查找头文件
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
#只在指定的目录(交叉编译)下查找依赖包
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

set(CMAKE_CXX_FLAGS "-g -Wall -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=${ARM_SYSROOT}")
set(CMAKE_CXX_LINK_FLAGS "--sysroot=${ARM_SYSROOT}")
set(CMAKE_C_FLAGS "-g -Wall -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=${ARM_SYSROOT}")
set(CMAKE_C_LINK_FLAGS "--sysroot=${ARM_SYSROOT}")
#设置编译的版本为debug版本。如果要编译realse版本,直接写realse即可
set(CMAKE_BUILD_TYPE Debug)

include_directories(${PROJECT_SOURCE_DIR}/inc)
aux_source_directory(./src SRC_LIST)
aux_source_directory(. SRC_LIST)
add_executable(my_test ${SRC_LIST})
set(EXECUTABLE_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/bin)#设置输出文件

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

添加外部库

动态库的添加:

link_directories(${PROJECT_SOURCE_DIR}/lib) #添加动态连接库的路径
target_link_libraries(project_name -lmxnet) #添加libmxnet.so
target_link_libraries(project_name -pthread -lm -ldl)#添加标准库

注意:link_directories()必须在add_executable()前,target_link_libraries()必须在add_executable()后面
静态库的添加:文章来源地址https://www.toymoban.com/news/detail-504503.html

add_library(mxnet STATIC IMPORTED)
set_property(TARGET mxnet PROPERTY IMPORTED_LOCATION /path/to/libmxnet.a)
target_link_libraries(project_name mxnet) #添加libmxnet.a

其他参考

# 指定要求cmake的最低版本
cmake_minimum_required(VERSION 3.0)

#设置交叉编译的环境
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

#指定交叉编译的gcc  g++。如果没有配置到环境变量,此处写绝对路径
set(CMAKE_C_COMPILER "arm-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER "arm-linux-gnueabi-g++")

############## 以下几条可以不设置(实测可以),官方文档上步骤 ############
#指定交叉编译环境的目录
set(CMAKE_FIND_ROOT_PATH "/usr/local/arm_4.9.4/arm-linux-gnueabi")
#从来不在指定目录(交叉编译)下查找工具程序。(编译时利用的是宿主的工具)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#只在指定目录(交叉编译)下查找库文件
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#只在指定目录(交叉编译)下查找头文件
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
#只在指定的目录(交叉编译)下查找依赖包
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
###################################################################

#设置C++ 编译的参数(根据需要自己设置)
set(CMAKE_CXX_FLAGS "-std=c++11 -DTEST -pthread -Wall -O0 -g3 -Wall  -fmessage-length=0 -fPIC")
set(CMAKE_C_FLAGS "-std=c99 -Wall -O0 -g3 -Wall -fmessage-length=0")
# -Wall       :  编译时显示警告信息
# -O          : 选择编译器优化的级别,-O0 不优化  -O1 -O2 -O3 不同程度的优化
# -g          :  生成调试信息,debug会用到。调试信息的级别。-g3 
#			    尽可能的生成gdb的可以使用的调试信息。默认为-g2。信息越多,编译出的程序越大。
# -std=c++11  : 编译所按照C++的标准
# -fmessage-length=0 :输出信息会根据控制台的宽度自动换行,这样就能看全输出信息了
# -fPIC       : 作用于编译阶段,告诉编译器产生与位置无关代码
#			    (Position-Independent Code)。加载到任意位置都能执行
# -DTEST	 : 设置TEST的宏定义,另外一种设置宏定义的方式可以直接使用 add_definitions(-D TEST) 添加

add_definitions(-D TEST2)	# 添加TEST2的宏

#设置编译的版本为debug版本。如果要编译realse版本,直接写realse即可
set(CMAKE_BUILD_TYPE "debug")  

# 程序所引用的头文件库目录。
include_directories(
    ${PROJECT_SOURCE_DIR}	# 当前工程的文件路径。如果需要其他库,要继续写所需要库的路径。
)

# 查找要需要编译的源文件。
# file函数将递归查文件夹及子文件夹下的所有.cpp 和 .c文件放到SRC中
# list函数排除build下面的.cpp和.c文件(在make过程中,会在bulid下面产生测试的cpp和c文件,避免冲突)
# 这样我们将所需要编译的源文件放到SRC中
# 有很多种搜索源文件的方法,感觉这是最省事的一种,其他可行百度
file(GLOB_RECURSE SRC *.cpp *.c)
file(GLOB_RECURSE SRC_EXPECT build/*.cpp build/*.c)
list(REMOVE_ITEM SRC ${SRC_EXPECT})


##################### 如果生成共享库 ########################
# 设置生成库的名字
set(LIB_NAME "test")
# 编译生成共享库
add_library("${LIB_NAME}"  SHARED  ${SRC})
# ${LIB_NAME} : 为库的名字
# SHARED :表示生成的是动态库。如果要编译成静态库替换成 STATIC 参数
# ${SRC} :需要编译的源文件

### 注意: 如果不是生成可执行文件,则不需要进行后续的连接动态库的操作。
###       在生成可执行可执行文件时,一块进行连接
###########################################################



#################### 如果生成可执行文件#####################
# 设置生成可执型文件的名字
set(SRC_NAME "test")
# 编译生成可执型文件
add_executable("${SRC_NAME}" ${SRC})
# ${SRC_NAME} : 生成可执型文件
# ${SRC} :需要编译的源文件

# 将可执行文件连接动态库,连接动态库的方式有很多,可以自行百度。
target_link_libraries("${SRC_NAME}" 
  	xxx.so			# 例如要连接xxx.so动态库
    )
###注意, 连接的多个动态库库如果有相互依赖关系,注意顺序,被依赖的库,
### 一定要放到前面。否则编译通过,放到设备上无法运行。
### 如果顺序有问题,实测会报BUSERROR或者一些其他的错误,很难定位
#############################################################

到了这里,关于CMake交叉编译配置实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu下VsCode+CMake 交叉编译

    参考连接: Ubuntu下VsCode+CMake 交叉编译 VSCode与CMake搭配使用之基本配置 VSCode与CMake搭配使用之交叉编译 step1: Ctrl+Shift+p打开VSCode的指令面板,然后输入cmake:q ; 在窗口搜索:“ CMake:Edit user-loacl CMake kits ”会打开一个cmake-tools-kits.json的文件. 如果搜索不到这个文件,先把cmake :qui

    2024年02月02日
    浏览(34)
  • Cmake学习记录(九)--使用Cmake交叉编译Android .so库

    注意:本教程没有关于JNI接口的写法,只是把C代码编译成适合android平台的so库,想查看完整代码可以参考文末的第9条参考链接 目前Android编译.so的话使用Android Studio比较简单,但是有时候时候Android Studio的话还需要创建一个Android的项目,这里记录下脱离Android Studio单纯使用Cma

    2024年02月12日
    浏览(40)
  • 使用CMake交叉编译Arm Linux程序

    注意,工具链文件的指定一定要紧跟cmake命令之后,不能放到 … 后面构建arm架构cmake 工程里新建一个文件叫arm_linux_setup.cmake arm_linux_setup.cmake内容如下

    2024年02月03日
    浏览(52)
  • Android JNI系列详解之CMake配置库文件的输出目录

    一、前提 阅读上一篇文章Android JNI系列详解之CMake编译工具的使用,里面讲到了需要配置两个文件:CMakeList.txt和build.gradle 二、配置CMake编译工具输出库文件的路径 1.默认的库文件输出路径:app/build/intermediates/cmake/debug/obj 由此可见不便于每次查找,因此我们需要将这个路径配置

    2024年02月10日
    浏览(37)
  • 【VSCode】Windows环境下,VSCode 搭建 cmake 编译环境(通过配置文件配置)

    除了之前的使用 VSCode 插件来编译工程外,我们也可以使用配置文件来编译cmake工程,主要依赖 launch.json 和 tasks.json 文件。 目录 一、下载编译器 1、下载 Windows GCC 2、选择编译器路径 二、配置 debug 环境 1、配置 lauch.json 文件 2、配置 tasks.json 文件 三、编译工程 1、测试工程结

    2024年02月03日
    浏览(47)
  • cmake与交叉编译(x86 to arm)过程和问题全记录

    公司维护一批c++动态库,由于生产需要,每次更新都要在windows、linux_x86、kylin_arm等多个环境中编译一遍,操作比较麻烦,所以想通过交叉编译的方式在一台机器上边编译多个环境的动态库,减少工作量。考虑到工作难度以及本人水平,决定从官方发布的成品交叉编译工具链中

    2024年04月28日
    浏览(44)
  • 安装交叉编译工具链aarch64-linux-gnu-g++ 以及cmake测试

       测试文件结构    CMakeLists.txt  参考文章: linux 交叉编译 C和C++_aarch64-linux-gnu-gcc查看版本_weixin_45302027的博客-CSDN博客 ubuntu16.04 安装交叉编译工具aarch64-linux-gnu-gccg++_ubuntu 安装aarch64-linux-gnu-gcc_普通网友的博客-CSDN博客

    2024年02月12日
    浏览(47)
  • Linux conan+cmake管理的项目如何进行多架构编译(x86_64及交叉编译arm64)

    Conan 和 CMake 是两个非常流行的跨平台开发工具,它们可以让开发者轻松管理依赖和构建项目,支持多种操作系统和架构。下面是一些关于 conan 和 cmake 的介绍: Conan Conan 是一个用于管理 C++ 依赖项的开源工具。它可以从公共或私有存储库中自动下载和安装依赖项。Conan 可以轻

    2024年02月09日
    浏览(44)
  • 4.Linux下Cmake交叉编译Qt项目到Jetson Orin Nano(arm)

    由于3:Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano(ARM)_月上林梢的博客-CSDN博客  这一篇文章只用手动配置,一直在点、点、点。比较 LOW,现在在Ubuntu上使用Cmake实现交叉编译QT程序到Jetson Orin Nano上。 提醒: 我的工作环境是 Visual Studio+QT+arm 由于 Ubuntu 下没有V

    2024年02月12日
    浏览(42)
  • 【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)

    程序的编写需要用到头文件,程序的编译需要lib文件,程序的运行需要dll文件,因此cmake引入第三方库其实就是将include目录、lib目录、bin目录引入工程。         目录 1、find_package(批量引入库文件和头文件) 2、include_directories(引入头文件目录) 3、link_directories(引入库

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包