1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 基于CMake的交叉编译工具链配置问题总结

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

时间:2023-01-13 18:30:02

相关推荐

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

在近期的工作中,因项目自动化测试需要,大量单元测试构建需要通过脚本来完成。然而目前的项目中编译器是基于GCC较老版本修改而来,因此并不能很好地支持目前的开源测试框架googletest。而且基于性能的考虑,有大量汇编代码实现的功能,如果要基于X86平台来完成单元测试,则有大量的汇编代码需要打桩,或者实现其C语言版本。考虑到CPU架构的差异性,此种方案的测试效果未必能达到预期。因此,测试行为在软仿环境下完成是最优选择。

CMake构建工具

之所以选择CMake,是因为CMake是一个跨平台的工程构建工具,为大型工程的构建提供了便捷。相对于直接书写Makefile脚本,CMake的语法更加简单。并且对于新的源码文件添加和删除,一般不需要更新CMake脚本,只需要重新生成Makefile即可。CMake内置了大部分平台的工具链,因此在X86环境下,CMake的使用方便且高效。然而,在嵌入式开发中,CPU架构种类繁多,各种魔改编译器千奇百怪。要正确使用CMake工具,首先就要自定义工具链配置脚本。

这里首先贴上我的脚本:

# Set compile tool pathFILE(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 chainif(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 pathSET(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设置了系统库的根目录,并且设置了系统库的查找模式,如果提示找不到系统库,可以检查这里的变量设置是否正确。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。