赞
踩
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的执行过程,并不真的执行,便于定位问题时加一些打印使用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。