华为云 OBS 海思交叉编译

2023-05-16

https://github.com/huaweicloud/huaweicloud-sdk-c-obs/blob/master/Readme.txt  内描述如下:

1. 第三方依赖:
    openssl(1.0.2r) zlib(1.2.11.0) libiconv(1.15) pcre(8.39) libssh2(1.9.0) libcurl(7.64.1) libxml2(2.9.9)  

2. 编译前准备:
    拷贝对应的第三方库源码至esdk_obs_c\third_party_groupware\eSDK_Storage_Plugins目录下,编译对应的第三方库

2.1 Windows环境编译
    预先编译第三方库,将对应的动态库文件拷贝至esdk_obs_c\source\eSDK_OBS_API\eSDK_OBS_API_C++\bin对应目录下,将对应的静态库文件拷贝至esdk_obs_c\source\eSDK_OBS_API\eSDK_OBS_API_C++\lib对应目录下

大家可以看到,上面的说明很笼统,本人经过尝试后,把方法整理出来,希望能帮到有需要的人

本人交叉编译的华为 obs 版本是: huaweicloud-sdk-c-obs-v3.19.9.3.tar.gz
压缩文件放到 /home/guopf/tools/
解压后进入目录,即 /home/guopf/tools/huaweicloud-sdk-c-obs/source/eSDK_OBS_API/eSDK_OBS_API_C++

修改 GNUmakefile 加上 includePath 的 ifdef BUILD_FOR_HI3516 的判断:
ifdef BUILD_FOR_ARM
   CC := gcc 
   libPath := aarch64
   includePath := arm
else
   ifdef BUILD_FOR_HI3516
        CC := arm-himix200-linux-gcc
        libPath := hi3516
        includePath := hi3516
   else

        ifdef BUILD_FOR_NDK_AARCH64
            CC := aarch64-linux-android-gcc
            libPath := ndk-aarch64
            includePath := ndk-aarch64
        else
            CC := gcc
            libPath := linux_64
            includePath := linux
        endif
    endif
endif

修改 GNUmakefile 加上 LIBICONV_CFLAGS 的 ifdef BUILD_FOR_HI3516 的判断:
ifndef LIBICONV_CFLAGS
     ifdef BUILD_FOR_NDK_AARCH64
     LIBICONV_CFLAGS := -I./../../../build/script/Provider/build/${includePath}/iconv-1.15/include
     else
        ifdef BUILD_FOR_HI3516
            LIBICONV_CFLAGS := -I./../../../build/script/Provider/build/${includePath}/iconv-1.15/include
        else

            LIBICONV_CFLAGS := -I./../../../third_party_groupware/eSDK_Storage_Plugins/libiconv-1.15/source/include
        endif
     endif
endif
     

在 /home/guopf/tools/huaweicloud-sdk-c-obs/build/script/Provider/build/ 路径下创建 hi3516 路径,这里便于描述记为HI3516_DIR,在 HI3516_DIR 下放依赖的第三方库(海思交叉编译过的),路径结构参照 HI3516_DIR 同级的arm或linux。


下面记录几个华为obs依赖的不太常见的第三方库的交叉编译:
( 本人凡是自己下载的源码,版本基本都是按照 华为 obs git 官方对应版本readme的版本要求来的)
 交叉编译 pcre : 
     下载源码 pcre-8.39.tar.gz ,解压后进入目录
      执行 ./configure --host=arm-himix200-linux --prefix=/home/guopf/tools/pcre-8.39/build
      执行 make -j100 && make install
      拷贝生成的头文件和库文件拷贝到 HI3516_DIR

      
  交叉编译 iconv 
     下载源码 libiconv-1.15.tar.gz ,解压后进入目录
      执行 ./configure --prefix=/home/guopf/tools/libiconv-1.15/build --host=arm-himix200-linux
      执行 make -j100 && make install
      拷贝生成的头文件和库文件拷贝到 HI3516_DIR
            
   交叉编译 log4cpp : 
     cd /home/guopf/tools/huaweicloud-sdk-c-obs/platform/eSDK_LogAPI_V2.1.10/log4cpp
     执行 ./configure CC=arm-himix200-linux-gcc CXX=arm-himix200-linux-g++ --host=arm-himix200-linux --prefix=/home/guopf/tools/huaweicloud-sdk-c-obs/platform/eSDK_LogAPI_V2.1.10/log4cpp/build
     执行 make -j100 && make install
     如果执行 configure 遇到 config.status: error: cannot find input file: `Makefile.in' 报错,
     则执行两个命令 1、 aclocal  2、 automake --add-missing 后再执行上面的 configure 和 make 以及 make install
     在 /home/guopf/tools/huaweicloud-sdk-c-obs/platform/eSDK_LogAPI_V2.1.10/C/ 路径下创建 hi3516 路径
     把安装好的 log4cpp 的动态库拷贝到 /home/guopf/tools/huaweicloud-sdk-c-obs/platform/eSDK_LogAPI_V2.1.10/C/hi3516
     说明: libeSDKLogAPI.so 依赖 log4cpp , eSDKLogAPI 是华为封装的
            
   交叉编译 eSDKLogAPI 
      cd /home/guopf/tools/huaweicloud-sdk-c-obs/platform/eSDK_LogAPI_V2.1.10/eSDKLogAPI
      修改 Makefile 文件, ARCH 的赋值逻辑改为
      ifndef ARCH
      ARCH := $(shell uname -m)
      endif
                
      修改 Makefile 文件, CXX 的赋值增加一个判断逻辑:
      else ifeq ($(ARCH), hi3516)
      CXX = arm-himix200-linux-g++
       
      修改 Makefile 文件, $(TARGET): $(OBJS) 下面的逻辑增加一个判断
      else ifeq ($(ARCH), hi3516)
      $(CXX) $(CXXFLAGS) $(SHARED) -DDEBUG -DENV_LINUX $^ -L../C/hi3516 -llog4cpp -o $(TARGET) -lpthread
                    
       执行 make ARCH=hi3516 -j10
       将编译好的 libeSDKLogAPI.so 库,也拷贝到 /home/guopf/tools/huaweicloud-sdk-c-obs/platform/eSDK_LogAPI_V2.1.10/C/hi3516
            
    交叉编译 securec (本人因为工程原来就有,没有自己再编译,下面是自己编的方法)
        cd /home/guopf/tools/huaweicloud-sdk-c-obs/platform/huaweisecurec/src
        修改 Makefile CC=arm-himix200-linux-g++ 以及 GCC=arm-himix200-linux-g++
        执行 make -j10
        拷贝生成的头文件和库文件拷贝到 HI3516_DIR
                
依赖的第三方库全部准备好之后,执行下面的 make 命令             
make openssl_version=openssl-1.0.2r BUILD_FOR_HI3516=1 -j10
说明: 由于本人现有工程使用的 openssl 版本是 openssl-1.0.2r 而非 openssl-1.1.1d ,
本人不想替换现在用的版本,所以在 make 时指定了一下版本,否则 GNUmakefile 内默认使用的是 openssl-1.1.1d

make 时可能遇到的报错:
1、 报错 cc1: error: unrecognized command line option ‘-Wno-implicit-fallthrough’ [-Werror]
去掉 GNUmakefile 中的编译选项 CFLAGS 中的 -Wno-implicit-fallthrough

2、 报错 cc1: all warnings being treated as errors
去掉 GNUmakefile 中的编译选项 CFLAGS 中的 -Werror

make 成功后,在当前路径下会生成一个 build 目录,里面有 include 和 lib 等文件

PS: make 时的 -n 参数是只打印make的执行过程,并不真的执行,便于定位问题时加一些打印使用

                              

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为云 OBS 海思交叉编译 的相关文章

随机推荐