cmake与交叉编译(x86 to arm)过程和问题全记录

这篇具有很好参考价值的文章主要介绍了cmake与交叉编译(x86 to arm)过程和问题全记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

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

搭建编译环境用ubuntu_x86虚拟机,动态库统一使用cmake构建编译,编译会用到一批第三方依赖库例如boost、opencv等等,既然我要生成能在kylin_arm上运行的动态库,那么这些编译过程中用到的三方库也必须是kylin_arm系统的。现在公司有一个完善的kylin_arm编译环境,所以为了节约成本,我就直接将环境中的三方库拷贝到ubuntu_x86虚拟机中,方便交叉编译的时候直接调用。

cmake中配置交叉编译工具链

, 这个比较简单,cmake可以制定gcc路径,那么我就用CROSS_COMPILE这个参数做一个区分,在编译的时候指定它为true(cmake source/fiename -DCROSS_COMPILE=true)那个cmake就会去交叉编译的路径下边查找gcc.

if(UNIX)
   if(CROSS_COMPILE)
     message(STATUS "CROSS_COMPILE:${CROSS_COMPILE}")
      SET(CMAKE_SYSTEM_NAME Linux)
      SET(CMAKE_SYSTEM_PROCESSOR arm)
      SET(TOOLCHAIN_DIR "$ENV{HOME}/x86ToArm/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu")
      set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc")
      set(CMAKE_CXX_COMPILER "${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++")
      set(CMAKE_LINKER "${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++")
   elseif (EXISTS "$ENV{HOME}/local/bin/gcc")
      set(CMAKE_C_COMPILER "$ENV{HOME}/local/bin/gcc")
      set(CMAKE_CXX_COMPILER "$ENV{HOME}/local/bin/g++")
      set(CMAKE_LINKER "$ENV{HOME}/local/bin/g++")
   elseif (EXISTS "/usr/local/bin/gcc")
      set(CMAKE_C_COMPILER /usr/local/bin/gcc)
      set(CMAKE_CXX_COMPILER /usr/local/bin/g++)
      set(CMAKE_LINKER /usr/local/bin/g++)
   endif()
endif()

message(STATUS "CMAKE_C_COMPILER is : ${CMAKE_C_COMPILER}")
message(STATUS "CMAKE_CXX_COMPILER is : ${CMAKE_CXX_COMPILER}")

二、问题1 can’t find “/lib64/libharfbuzz.so”……

在编译的时候报错找不到一批这样的文件,于是我从现有的 kylin_arm里边拷贝过来放在交叉编译工具连里边。但是之后发现只有放在系统/lib64下边才能被找到,这显然还是有问题,我的交叉编译工具链我希望它是可以移植的。于是我考虑是不是我需要在cmake中设置交叉编译的

知识点:
(1)在交叉编译工具连中aarch64-linux-gnu/libc是系统根目录,libc/lib== lib, libc/usr/lib==/usr/lib
(2) 在cmake里边可以通过SET(CMAKE_SYSROOT "${TOOLCHAIN_DIR}/aarch64-linux-gnu/libc") 指定根路径, SET(CMAKE_FIND_ROOT_PATH "${CMAKE_SYSROOT}/lib64" "$ENV{HOME}/YEECOH_LIBS_Arm") 指定搜索路径

问题分析:cmake中设置了各种路径都不起作用,它还是顽强的去/lib64下边寻找,然后忽然发现报错的库都是opencv库间接使用的,那么可以想到/lib64的路径可能是由opencv库中的cmake写死了。检查发现果然在opencv-4.5.1/lib64/cmake/opencv4/OpenCVModules.cmake中opencv将其调用的一些库路径写死了,于是将其修改为"\$<LINK_ONLY:harfbuzz>"(这是opencv中统一的写法,也可将路径直接修改成交叉编译的路径。)

三、问题2 basic_ostringstream未定义的引用

arm x86交叉编译,gcc编译 与交叉编译(x86 to arm),arm开发分析:
(1) 交叉编译中自带的glibc版本是libstdc++.so.6.0.24, 麒麟编译使用的版本是0.28.
(2) 使用命令:nm -D /home/x86ToArm/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/libstdc++.so | c++filt | grep basic_ostringstream 查看报错的那个basic_ostringstream发现0.28版本中有定义,而0.24中没有定义。那么基本可以确定是版本不对的问题。 【参考链接:https://blog.csdn.net/Three_dog/article/details/104701644】
arm x86交叉编译,gcc编译 与交叉编译(x86 to arm),arm开发(3)检查发现/home/x86ToArm/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/lib64这个路径下边是交叉编译自带的libstdc++.so.6.0.24,交叉编译使用的应该是他, 从现有的kylin_arm环境中将0.28的版本拷贝过来替换掉交叉编译中的libstdc++.so.6.0.24(一套库),这个报错就没有了

四、问题3 libc.so 未定义的引用

arm x86交叉编译,gcc编译 与交叉编译(x86 to arm),arm开发
知识点:
(1)libc.so: glibc, 是底层c库; listdc++.so: 底层c++库。
(2) listdc++.so可以直接通过替换动态库文件来升级版本;但是libc.so不能简单替换,由交叉编译工具的制作过程可知,gcc与glibc是强关联的。

分析:
我在编译动态库的过程中是从现有的麒麟arm环境中拷贝了所需的一些底层库, 该麒麟环境有两套gcc: gcc9.3 + libc0.28 + libstdc++ 0.28 、gcc7.3+libc0.24+libstdc++0.24。 其中有两个库是用libc0.28编译的。而我使用的交叉编译工具链是:gcc7.3+ glibc0.24+libstdc++0.24。由于libc不能直接拷贝替换,那就只能考虑使用更高版本的交叉编译工具链。从官网下载了一个比较合适的版本:gcc8.3+libc0.28+libstdc++0.25。将其中的stdc++动态可直接替换成0.28版本的,就可以了。最终生成的动态库可以在现有的麒麟arm环境中运行。文章来源地址https://www.toymoban.com/news/detail-860368.html

到了这里,关于cmake与交叉编译(x86 to arm)过程和问题全记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ubuntu x86搭建 麒麟arm QT6交叉编译

    近期项目需求开发平台是unbuntu x86,目标机器是UOS arm架构,由于需要在不同平台上使用程序,需要建立基于QT6.32的交叉编译平台 交叉编译器 https://blog.csdn.net/zhang421412170/article/details/110952705 下载 gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz(因为我这里用的是linux平台进行编译,需要

    2024年02月13日
    浏览(32)
  • x86架构ubuntu 搭建arm64交叉编译环境及QT编译arm64架构工程

    背景:由于最近项目需要做国产系统适配,很多软件需要重新编译以适配不同架构CPU。 环境: 1、主机win10 64bit   vmware虚拟主机ubuntu1804 64bit 2、vmware虚拟主机已经安装了qt5.14.2及qt_create4.11.1 一、C/C++程序交叉编译 1、交叉编译环境搭建 ①选定编译工具aarch64-linux-gnu ②安装交叉

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

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

    2024年02月09日
    浏览(35)
  • 交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64

    1.交叉编译是什么,为什么要交叉编译 编译:在一个平台上生成在该平台上的可执行代码 交叉编译:在一个平台上生成在另一个平台上的可执行代码 交叉编译的例子:如51单片机的可执行代码(hex文件)是在集成环境keil上面编译完成的,我们只需要将编译好的可执行代码下

    2024年02月15日
    浏览(32)
  • 带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

    带wiringPi库的交叉编译如何进行 先交叉编译wiringPi库,编译出的库适合香橙派,这时候交叉编译可执行程序的平台和链接库的格式也是正确的 ,然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置,但是现在还没有学习过,后面学了补上 此时如果把wiringPi库拿到Ubuntu上进

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

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

    2024年02月03日
    浏览(37)
  • 【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践

    在现代计算机系统中,X86和ARM64是两种常见的处理器架构。为了满足不同架构的需求,Docker镜像也需要支持双架构编包形式。本文将介绍Docker镜像双架构编包统一的实践     在Docker镜像中,通常使用多阶段构建来实现。在第一阶段,构建出对应架构服务的二进制文件;在第二

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

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

    2024年02月12日
    浏览(28)
  • ubuntu上安装boost库为SOMEIP的X86和ARM下编译做准备(编译两种版本)

    Boost库是C++拓展库,是SOMEIP源码编译所必需的库。编译 Boost 库时,需要根据不同的架构,选择不同的工具链和参数 首先,Boost源码下载,Boost官网:https://www.boost.org 基于此处我编译的SOMEIP源码版本,需要安装1.74版本的Boost库,下载链接:https://boostorg.jfrog.io/artifactory/main/relea

    2024年02月10日
    浏览(29)
  • Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程

    苦辣酸甜时光八载,春夏秋冬志此一生 Qt简介: Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。 Qt 支持的操作系统有很多,例如通用

    2024年01月23日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包