在近期的工作中,因项目自动化测试需要,大量单元测试构建需要通过脚本来完成。然而目前的项目中编译器是基于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)

踩坑总结

  1. 系统名称这里选择的Generic。这里需要注意的是,我的目标平台是没有操作系统的,我要生成软仿环境下的可执行文件,所以应该配置成Generic。如果不进行设置,CMake会自动检测当前的运行环境,然后CMake会自动调用一些内置脚本,最后生成当前操作系统下对应的编译文件。比如我的工作环境是windows,我一开始没有设置这个变量,最后编译出来的是.exe文件,然而由于底层指令并不是X86的指令集,所以windows无法运行这个.exe文件。而且由于ELF格式问题,软仿环境也无法运行这个文件。

  1. 设置强制编译器。INCLUDE(CMakeForceCompiler)的作用是,强制跳过编译器的标识检测。CMake会通过编译一些内置小程序,来检测编译器的标识。但是不是所有编译器都能通过编译器的检测,特别是嵌入式架构的编译器。

  1. 工具链包含的内容。工具链的设置包含一系列编译过程中,会用到的配套工具。不仅仅包括C/C++的编译器,还包括汇编编译器,linker/ar/nm/objdump等等,具体参考line 16-38。

  1. 既然设置了自定义的编译器,那么编译工程中的系统库自然也要配套。line 41-44设置了系统库的根目录,并且设置了系统库的查找模式,如果提示找不到系统库,可以检查这里的变量设置是否正确。

基于CMake的交叉编译工具链配置问题总结相关推荐

  1. 使用CMAKE和交叉编译工具链

    记录使用CMake过程中的一段CMakeLists.txt的代码以及交叉编译脚本cross.cmake的代码. 文章目录 一.CMakeLists.txt 二.cross.cmake 总结 提示:代码 ...

  2. cmake:ESP32交叉编译工具链定义

    ESP32的SDK(ESP-IDF)本身提供了esp32平台的cmake toolchain文件: esp-idf-v4.4\tools\cmake\toolchain-esp32.cmake 1就是 ...

  3. 基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结(一)

    最近刚刚接触XILINX的ZYNQ板,刚接触没有十天.XILINX定位它为SOC,我也很认同,起码比TI定位MPU为SOC强很多.据说今年TI的最新产品也加入了ZYNQ板. 之前的MIPS处理器设计与 ...

  4. zynq linux opencv效率,2 - 基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结

    可以通过输入echo $PATH命令检查环境变量是否设置正确,如下图: 可以,编译C文件进行测试, 使用gedit在任意目录下编辑hello.c文件如图所示,保存后进入终端. 以root身份进入到当前 ...

  5. cmake:基于MDK(Keil)的Nationstech.N32G45x平台交叉编译工具链定义

    Keil MDK是非常常用的单片机开发集成环境,Keil公司2005年由ARM公司收购,现在是ARM主要的嵌入系统开发平台(ARM的另一个开发环境ds-5早在九年前就停止更新了). Keil虽然是个集 ...

  6. Mastering Embedded Linux Programming 学习 (一)嵌入式交叉编译工具链的构建,基于crosstool-NG

    Mastering Embedded Linux Programming 学习 (一) 一.ubuntu 软件包下载 sudo apt install autoconf automake bison ...

  7. arm-linux交叉编译工具链的制作(基于S3C2440)【转】

    本文转载自:http://eric-gao.iteye.com/blog/2160622 制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG,前者使用方便, ...

  8. 使用 Android NDK 的交叉编译工具链移植 C/C++ 项目到安卓平台

    什么是 NDK? Android NDK 是一套可以让开发者在安卓应用开发中使用 C/C++ 实现特定模块的工具集,不是所有应用都需要用到,但是正确地使用可以有效提高应用运行效率和安全性. 为什么要在 ...

  9. 交叉编译及树莓派(或其他平台)交叉编译工具链的安装

    交叉编译是什么: 交叉编译是一个行为,是在一个平台上生成另一个平台上的可执行代码. 比如:我们在windows上面编写C51的代码,并编译成可执行代码,如xx.hex,是在C51上面运行不是在wind ...

最新文章

  1. 操作系统学习:Linux0.12初始化详细流程-进程1调度与读取硬盘数据
  2. Oracle 11 密码永不过期
  3. Objective-c(1)
  4. 【l转】VS2015下解决:无法解析的外部符号 __imp___vsnprintf 及__iob_func
  5. 上去了server查所有表空间_oracle如何查看表空间
  6. 数据库(表结构和数据) 保存为 *.sql文件
  7. Agilent RF fundamentals (2)- fundamental units of RF
  8. vsftpd配置好防火墙后从网页登录ftp却无法访问此页面
  9. pmp中项目经理如何进行目标设定
  10. 解析MOS管推挽电路组成结构和特征优缺点
  11. 如何免费的使用思维导图和流程图制作(Draw.io VS 代码集成)
  12. CSS基础教程——纯CSS开发的气泡式提示框
  13. cmt obm odm 代工模式oem_工厂有OEM,ODM,OBM之分吧,分别是什么意思?
  14. 九度 OJ 之 题目1538:GrassLand密码
  15. Python爬虫进阶之某支付网站密码分析
  16. 计算机中网络协议三要素,网络协议的三要素是什么?各有什么含义?
  17. 【2019工研/模拟】九键输入法(巧用数组)
  18. 关于用迅雷会下载到比较旧的资源版本?
  19. TVP尖峰对话李开复沈春华:AI未来进行式与技术的发展
  20. 服装行业MES解决方案

热门文章

  1. ali druid 自定义filter
  2. 构造函数能否被继承,为什么?
  3. Cloudera Manager搭建集群服务器启动失败
  4. 2017-09-02:公共钥匙盒
  5. 月球公转与自转(二)
  6. 最长回文子串(C++)
  7. Jackson - 将 JSON 字符串转换为 Map
  8. js promise.all
  9. 在zabbix中使用使用pg_monz模板日常监控postgresql的log文件
  10. 计算机网络管理技师代号,计算机网络管理技师复习资料.doc