基于CMake的交叉编译工具链配置问题总结
在近期的工作中,因项目自动化测试需要,大量单元测试构建需要通过脚本来完成。然而目前的项目中编译器是基于GCC较老版本修改而来,因此并不能很好地支持目前的开源测试框架googletest。而且基于性能的考虑,有大量汇编代码实现的功能,如果要基于X86平台来完成单元测试,则有大量的汇编代码需要打桩,或者实现其C语言版本。考虑到CPU架构的差异性,此种方案的测试效果未必能达到预期。因此,测试行为在软仿环境下完成是最优选择。
CMake构建工具
之所以选择CMake,是因为CMake是一个跨平台的工程构建工具,为大型工程的构建提供了便捷。相对于直接书写Makefile脚本,CMake的语法更加简单。并且对于新的源码文件添加和删除,一般不需要更新CMake脚本,只需要重新生成Makefile即可。CMake内置了大部分平台的工具链,因此在X86环境下,CMake的使用方便且高效。然而,在嵌入式开发中,CPU架构种类繁多,各种魔改编译器千奇百怪。要正确使用CMake工具,首先就要自定义工具链配置脚本。
这里首先贴上我的脚本:
# Set compile tool path
FILE(TO_CMAKE_PATH $ENV{ZSP_HOME_G5} ZVIEW_ROOT_PATH)
SET(ZVIEW_ROOT_BIN_PATH ${ZVIEW_ROOT_PATH}/cmdtools/bin)# Set system information, no operation system, "Generic" is selected.
SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_SYSTEM_VERSION 1.0)
SET(CMAKE_SYSTEM_PROCESSOR nanoplus)INCLUDE(CMakeForceCompiler)
SET(CMAKE_C_COMPILER_FORCED TRUE)
SET(CMAKE_CXX_COMPILER_FORCED TRUE)
#SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)# Set tool chain
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")SET(CMAKE_NM "${ZVIEW_ROOT_BIN_PATH}/znm")SET(CMAKE_OBJDUMP "${ZVIEW_ROOT_BIN_PATH}/zobjdump")SET(CMAKE_OBJCOPY "${ZVIEW_ROOT_BIN_PATH}/zobjcopy")SET(CMAKE_RANLIB "${ZVIEW_ROOT_BIN_PATH}/zranlib")SET(CMAKE_C_COMPILER "${ZVIEW_ROOT_BIN_PATH}/zcc")SET(CMAKE_CXX_COMPILER "${ZVIEW_ROOT_BIN_PATH}/zc++")SET(CMAKE_ASM_COMPILER "${ZVIEW_ROOT_BIN_PATH}/zcc")SET(CMAKE_LINKER "${ZVIEW_ROOT_BIN_PATH}/zld" CACHE INTERNAL "")SET(CMAKE_AR "${ZVIEW_ROOT_BIN_PATH}/zar" CACHE INTERNAL "")SET(CMAKE_MAKE_PROGRAM "${ZVIEW_ROOT_BIN_PATH}/zmake" CACHE INTERNAL "")
else()SET(CMAKE_NM "${ZVIEW_ROOT_BIN_PATH}/znm.exe")SET(CMAKE_OBJDUMP "${ZVIEW_ROOT_BIN_PATH}/zobjdump.exe")SET(CMAKE_OBJCOPY "${ZVIEW_ROOT_BIN_PATH}/zobjcopy.exe")SET(CMAKE_RANLIB "${ZVIEW_ROOT_BIN_PATH}/zranlib.exe")SET(CMAKE_C_COMPILER "${ZVIEW_ROOT_BIN_PATH}/zcc.exe")SET(CMAKE_CXX_COMPILER "${ZVIEW_ROOT_BIN_PATH}/zc++.exe")SET(CMAKE_ASM_COMPILER "${ZVIEW_ROOT_BIN_PATH}/zcc.exe")SET(CMAKE_LINKER "${ZVIEW_ROOT_BIN_PATH}/zld.exe" CACHE INTERNAL "")SET(CMAKE_AR "${ZVIEW_ROOT_BIN_PATH}/zar.exe" CACHE INTERNAL "")SET(CMAKE_MAKE_PROGRAM "${ZVIEW_ROOT_BIN_PATH}/zmake.exe" CACHE INTERNAL "")
endif()# Set system lib path
SET(CMAKE_FIND_ROOT_PATH "${ZVIEW_ROOT_PATH}/cmdtools/zspnano-NONE-elf/")
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
踩坑总结
系统名称这里选择的Generic。这里需要注意的是,我的目标平台是没有操作系统的,我要生成软仿环境下的可执行文件,所以应该配置成Generic。如果不进行设置,CMake会自动检测当前的运行环境,然后CMake会自动调用一些内置脚本,最后生成当前操作系统下对应的编译文件。比如我的工作环境是windows,我一开始没有设置这个变量,最后编译出来的是.exe文件,然而由于底层指令并不是X86的指令集,所以windows无法运行这个.exe文件。而且由于ELF格式问题,软仿环境也无法运行这个文件。
设置强制编译器。INCLUDE(CMakeForceCompiler)的作用是,强制跳过编译器的标识检测。CMake会通过编译一些内置小程序,来检测编译器的标识。但是不是所有编译器都能通过编译器的检测,特别是嵌入式架构的编译器。
工具链包含的内容。工具链的设置包含一系列编译过程中,会用到的配套工具。不仅仅包括C/C++的编译器,还包括汇编编译器,linker/ar/nm/objdump等等,具体参考line 16-38。
既然设置了自定义的编译器,那么编译工程中的系统库自然也要配套。line 41-44设置了系统库的根目录,并且设置了系统库的查找模式,如果提示找不到系统库,可以检查这里的变量设置是否正确。
基于CMake的交叉编译工具链配置问题总结相关推荐
- 使用CMAKE和交叉编译工具链
记录使用CMake过程中的一段CMakeLists.txt的代码以及交叉编译脚本cross.cmake的代码. 文章目录 一.CMakeLists.txt 二.cross.cmake 总结 提示:代码 ...
- cmake:ESP32交叉编译工具链定义
ESP32的SDK(ESP-IDF)本身提供了esp32平台的cmake toolchain文件: esp-idf-v4.4\tools\cmake\toolchain-esp32.cmake 1就是 ...
- 基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结(一)
最近刚刚接触XILINX的ZYNQ板,刚接触没有十天.XILINX定位它为SOC,我也很认同,起码比TI定位MPU为SOC强很多.据说今年TI的最新产品也加入了ZYNQ板. 之前的MIPS处理器设计与 ...
- zynq linux opencv效率,2 - 基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结
可以通过输入echo $PATH命令检查环境变量是否设置正确,如下图: 可以,编译C文件进行测试, 使用gedit在任意目录下编辑hello.c文件如图所示,保存后进入终端. 以root身份进入到当前 ...
- cmake:基于MDK(Keil)的Nationstech.N32G45x平台交叉编译工具链定义
Keil MDK是非常常用的单片机开发集成环境,Keil公司2005年由ARM公司收购,现在是ARM主要的嵌入系统开发平台(ARM的另一个开发环境ds-5早在九年前就停止更新了). Keil虽然是个集 ...
- Mastering Embedded Linux Programming 学习 (一)嵌入式交叉编译工具链的构建,基于crosstool-NG
Mastering Embedded Linux Programming 学习 (一) 一.ubuntu 软件包下载 sudo apt install autoconf automake bison ...
- arm-linux交叉编译工具链的制作(基于S3C2440)【转】
本文转载自:http://eric-gao.iteye.com/blog/2160622 制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG,前者使用方便, ...
- 使用 Android NDK 的交叉编译工具链移植 C/C++ 项目到安卓平台
什么是 NDK? Android NDK 是一套可以让开发者在安卓应用开发中使用 C/C++ 实现特定模块的工具集,不是所有应用都需要用到,但是正确地使用可以有效提高应用运行效率和安全性. 为什么要在 ...
- 交叉编译及树莓派(或其他平台)交叉编译工具链的安装
交叉编译是什么: 交叉编译是一个行为,是在一个平台上生成另一个平台上的可执行代码. 比如:我们在windows上面编写C51的代码,并编译成可执行代码,如xx.hex,是在C51上面运行不是在wind ...
最新文章
- 操作系统学习:Linux0.12初始化详细流程-进程1调度与读取硬盘数据
- Oracle 11 密码永不过期
- Objective-c(1)
- 【l转】VS2015下解决:无法解析的外部符号 __imp___vsnprintf 及__iob_func
- 上去了server查所有表空间_oracle如何查看表空间
- 数据库(表结构和数据) 保存为 *.sql文件
- Agilent RF fundamentals (2)- fundamental units of RF
- vsftpd配置好防火墙后从网页登录ftp却无法访问此页面
- pmp中项目经理如何进行目标设定
- 解析MOS管推挽电路组成结构和特征优缺点
- 如何免费的使用思维导图和流程图制作(Draw.io VS 代码集成)
- CSS基础教程——纯CSS开发的气泡式提示框
- cmt obm odm 代工模式oem_工厂有OEM,ODM,OBM之分吧,分别是什么意思?
- 九度 OJ 之 题目1538:GrassLand密码
- Python爬虫进阶之某支付网站密码分析
- 计算机中网络协议三要素,网络协议的三要素是什么?各有什么含义?
- 【2019工研/模拟】九键输入法(巧用数组)
- 关于用迅雷会下载到比较旧的资源版本?
- TVP尖峰对话李开复沈春华:AI未来进行式与技术的发展
- 服装行业MES解决方案