鸿蒙系统设备开发之编译原理 解耦 第三方库交织编译 详解 ...

水军大提督  论坛元老 | 2024-6-28 17:53:11 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1603|帖子 1603|积分 4809

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x


目次
媒介
一、编译原理
1、编译解析
2、Clang/LLVM开源编译器工具链
二、鸿蒙clang交织编译应用(编译解耦)
1、clang交织编译hello.c示例
2、clang交织编译C/C++项目Makefile示例
3、打包迁徙clang编译工具和sysroot到别的服务器
三、鸿蒙第三方库交织编译
1、编译zlib
2、编译openssl
3、编译mosquitto(mqtt)
4、编译libevent
4.1 下载源码
4.2 交织编译
4.3 过程中出现的问题总结
5、编译libcurl


媒介

           在Linux下,我们风俗了使用gcc、g++或别的交织编译工具链,对C/C++应用程序进行编译。但是,在鸿蒙系统设备开发引导文档中,我们发现编写1个“Hello World”应用程序,是通过编辑BUILD.gn文件,与完整的鸿蒙系统全套代码一起团体编译打包的,整个流程耗时很长,耦合性太高。
          因此,本文将详细解析鸿蒙设备开发中的代码编译原理,将代码编译和鸿蒙源码编译解耦,到达Linux下编译的效果,并提供一些第三方库交织编译的案例,比方libcurl、openssl库等
  
一、编译原理

1、编译解析

在Linux下将hello.c编译成可执行文件,在控制台中执行下面下令:
  1. gcc hello.c -o hello
复制代码
看似一条简朴的下令,现实上编译工具隐藏了很多信息,我们可以在编译下令中多加一个`-v`, 也就是`gcc hello.c -o hello -v`, 它会把编译时使用的全部选项都打印出来:

通过打印信息可知,gcc编译工具现实上是别的一个编译工具文件,而且编译的时候背面添加了很多参数,如:编译的目的系统 'Target: x86_64-linux-gnu' 、cpu架构 '-march=x86-64'
查察一下gcc到底是什么,输入:
  1. ls -l /usr/bin/gcc*
复制代码

可知,gcc或g++现实上也是指向某个交织编译工具链的软连接。
由此,可以想到,只要我们找到一个类似于gcc的编译工具,再在编译的时候指定一些链接参数,就可以为鸿蒙系统的编译各种应用了。
2、Clang/LLVM开源编译器工具链

        在后来的开发中,通过各种打印信息,发现鸿蒙系统下使用BUILD.gn配置文件对应用进行打包编译,使用了clang这个编译工具对代码进行编译,那么clang是什么东西呢?

        Clang/LLVM是一套开源的编译器工具链,用于开发编译器前端、后端、运行时及相关工具。Clang是LLVM项目的一部分,用以作为C、C++、Objective-C等语言的编译器前端,而LLVM则主要提供后端技术,可广泛应用于Windows、Linux、macOS、iOS、Android、ARM-Linux等平台。
        Clang设计目的是提供一个基于LLVM的高性能、易于使用且具有精彩诊断(错误与警告信息)和GCC兼容性的编译器。Clang的一大特点是它的模块化设计,允许它被用在多种不同的情境中,比如作为IDE的代码分析工具。
        LLVM(Low Level Virtual Machine)是一个编译器基础设施,提供了一套完整的编译器组件。LLVM界说了一个中间表现(IR)语言,并提供了生成和优化IR的工具。IR是一个与硬件无关的指令集,允许编译器先将程序源码编译成IR,然后LLVM可以将IR优化和转换成针对不同机器目的平台的机器码。
        在使用Clang/LLVM编译器的时候 ,通过设定一些编译器的链接参数,就能将代码编译成目的平台上的代码,可也不是什么目的都支持,就比如OpenHarmony是一个新的操纵系统,官方的Clang/LLVM就临时还不支持,所以,我们不能用apt-get下载官方版Clang/LLVM来编译,必须用鸿蒙代码路径下的Clang/LLVM版本,这是华为公司为了OpenHarmony而特殊定制的Clang/LLVM版本,
二、鸿蒙clang交织编译应用(编译解耦)


1、clang交织编译hello.c示例

        鸿蒙代码路径下的Clang/LLVM版本,安装在OpenHarmony源码路径的prebuilts下,查察clang的版本信息:
  1. /home/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang -v
复制代码

        从打印信息中,可知clang安装目次和当前clang依靠的gcc版本。
        Clang在设计的时候,为了兼顾gcc使用者的使用风俗,继承了gcc绝大部分选项风俗,你险些可以将gcc全套下令照搬过来,只是把gcc换成clang下令,再加上一些编译链参数即可,如下:
(1)设置"--target"选项,指定为"--target=arm-linux-ohos"
(2)设置"--sysroot"选项,用于指定编译器在编译某个芯片开发板过程中所使用的标准库和头文件所在的目次, 在OpenHarmony源码执行过某个开发板完整编译后的编译输出路径中找到这个目次(out/目次下)
(3)别的链接器的相关设置:
        浮点运算,比如 "-mfloat-abi=softfp”;
        cpu类型,比如 ”-mcpu=cortex-a55“ ;(也可不设)
        处置处罚器架构,比如 ”-march=armv7-a“ ;(也可不设)
        ...

比方:为RK3568开发板的鸿蒙系统编译hello.c
  1. /home/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang \
  2. -o hello hello.c -Wall \
  3. --target=arm-linux-ohos \
  4. --sysroot=/home/openharmony/out/rk3568/obj/third_party/musl \
  5. -march=armv7-a -mfloat-abi=softfp
复制代码
file指令可查察编译出来的可执行文件格式:
  1. file hello
复制代码

2、clang交织编译C/C++项目Makefile示例

Makefile:
  1. #################################################
  2. #description: OpenHarmony make c/c++
  3. #author: zyh
  4. #date: 2023-11-17
  5. #################################################
  6. OHOS_TOOLCHAIN:=/home/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm
  7. OHOS_SYSROOT_RK3568:=/home/openharmony/out/rk3568/obj/third_party/musl
  8. CC:=$(OHOS_TOOLCHAIN)/bin/clang
  9. CXX:=$(OHOS_TOOLCHAIN)/bin/clang++
  10. AR:=$(OHOS_TOOLCHAIN)/bin/llvm-ar
  11. AS:=$(OHOS_TOOLCHAIN)/bin/llvm-as
  12. NM:=$(OHOS_TOOLCHAIN)/bin/llvm-nm
  13. STRIP:=$(OHOS_TOOLCHAIN)/bin/llvm-strip
  14. RANLIB:=$(OHOS_TOOLCHAIN)/bin/llvm-ranlib
  15. LD:=$(OHOS_TOOLCHAIN)/bin/ld.lld
  16. LDFLAGS:="--rtlib=compiler-rt -fuse-ld=lld"
  17. #OHOS_CFLAGS_RK3568:= --target=arm-linux-ohos --sysroot=$(OHOS_SYSROOT_RK3568) -march=armv7-a -mfloat-abi=softfp -mcpu=cortex-a55 -mfpu=neon
  18. OHOS_CFLAGS_RK3568:= --target=arm-linux-ohos --sysroot=$(OHOS_SYSROOT_RK3568) -march=armv7-a -mfloat-abi=softfp
  19. TARGET=test_app
  20. SRC_DIR:= . src
  21. SRC_DIR+=
  22. INC_DIR:= $(SRC_DIR)
  23. SRCS:= $(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))
  24. SRCS+= $(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.cpp))
  25. INCS:= $(addprefix -I ,$(INC_DIR))
  26. OBJS:= $(SRCS:.c=.o)
  27. OBJS:= $(OBJS:.cpp=.o)
  28.                
  29. #CFLAGS:= -Wall -D_RK3568_OHOS
  30. CFLAGS:= -Wall
  31. LIBS:= -lpthread
  32. #LIBS+= -L libs_ohos/
  33. all: $(TARGET)
  34. %.o: %.c
  35.         $(CC) -c $< -o $@ $(INCS) $(CFLAGS) $(OHOS_CFLAGS_RK3568)
  36. %.o: %.cpp
  37.         $(CXX) -c $< -o $@ $(INCS) $(CFLAGS) $(OHOS_CFLAGS_RK3568)
  38.        
  39. $(TARGET): $(OBJS)
  40.         $(CC) -o $@ $^ $(LIBS) $(OHOS_CFLAGS_RK3568)
  41. clean:
  42.         rm -f $(OBJS) $(TARGET)
复制代码
3、打包迁徙clang编译工具和sysroot到别的服务器

        根据上述的编译过程,我们可知,编译只必要依靠clang编译工具和sysroot文件,那么将鸿蒙源码下的clang编译工具out目次下相关开发板的sysroot目次打包迁徙到别的linux服务器上,我们照样可以编译,打包指令如下:
  1. cd /home/openharmony
  2. tar -zcf rk_ohos_cross.tar.gz prebuilts/clang/ohos/linux-x86_64/llvm out/rk3568/obj/third_party/musl
复制代码
压缩文件放到别的linux服务器的某个目次下,解压即可:
  1. tar -zxf rk_ohos_cross.tar.gz
复制代码
三、鸿蒙第三方库交织编译

1、编译zlib



  • 下载源码
  1. wget https://zlib.net/current/zlib.tar.gz
  2. tar -zxf zlib.tar.gz
  3. cd zlib-1.3/
  4. mkdir my_build
复制代码


  • 鸿蒙系统开发编译环境下(发起使用官方docker容器),为rk3568开发板编译:
  1. #配置环境变量:路径需根据实际修改
  2. //OHOS_TOOLCHAIN:是clang编译工具的实际路径
  3. //OHOS_SYSROOT:绝对路径,用于指定编译器在编译某个芯片开发板过程中所使用的标准库和头文件所在的目录, 在OpenHarmony源码执行过完整编译后的编译输出路径中找到这个目录(out/..)
  4. export OHOS_TOOLCHAIN=/home/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm
  5. export OHOS_SYSROOT=/home/openharmony/out/rk3568/obj/third_party/musl
  6. export CC=${OHOS_TOOLCHAIN}/bin/clang
  7. export CPP=${OHOS_TOOLCHAIN}/bin/clang++
  8. export AR=${OHOS_TOOLCHAIN}/bin/llvm-ar
  9. export AS=${OHOS_TOOLCHAIN}/bin/llvm-as
  10. export NM=${OHOS_TOOLCHAIN}/bin/llvm-nm
  11. export STRIP=${OHOS_TOOLCHAIN}/bin/llvm-strip
  12. export RANLIB=${OHOS_TOOLCHAIN}/bin/llvm-ranlib
  13. export LD=${OHOS_TOOLCHAIN}/bin/ld.lld
  14. export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"
  15. export CFLAGS="--target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"
  16. #编译安装,指定安装路径(prefix)
  17. ./configure --prefix=$(pwd)/my_build
  18. make -j4
  19. make install
复制代码
2、编译openssl



  • 下载源码
  1. wget  https://www.openssl.org/source/openssl-1.1.1a.tar.gz
  2. tar -xvf openssl-1.1.1a.tar.gz
  3. cd openssl-1.1.1a/
  4. mkdir my_build
复制代码


  • 鸿蒙系统开发编译环境下(发起使用官方docker容器),为rk3568开发板编译:
  1. #配置环境变量:路径需根据实际修改
  2. //OHOS_TOOLCHAIN:是clang编译工具的实际路径
  3. //OHOS_SYSROOT:绝对路径,用于指定编译器在编译某个芯片开发板过程中所使用的标准库和头文件所在的目录, 在OpenHarmony源码执行过完整编译后的编译输出路径中找到这个目录(out/..)
  4. export OHOS_TOOLCHAIN=/home/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm
  5. export OHOS_SYSROOT=/home/openharmony/out/rk3568/obj/third_party/musl
  6. export CC=${OHOS_TOOLCHAIN}/bin/clang
  7. export CXX=${OHOS_TOOLCHAIN}/bin/clang++
  8. export AR=${OHOS_TOOLCHAIN}/bin/llvm-ar
  9. export AS=${OHOS_TOOLCHAIN}/bin/llvm-as
  10. export NM=${OHOS_TOOLCHAIN}/bin/llvm-nm
  11. export STRIP=${OHOS_TOOLCHAIN}/bin/llvm-strip
  12. export RANLIB=${OHOS_TOOLCHAIN}/bin/llvm-ranlib
  13. export LD=${OHOS_TOOLCHAIN}/bin/ld.lld
  14. export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"
  15. export CFLAGS="--target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"
  16. #编译安装到指定目录(--prefix)
  17. #./Configure linux-aarch64 --prefix=$(pwd)/my_build no-asm shared
  18. ./Configure linux-armv4 --prefix=$(pwd)/my_build no-asm shared
  19. make clean
  20. make -j4
  21. make install
复制代码
3、编译mosquitto(mqtt)



  • 下载源码
  1. wget https://mosquitto.org/files/source/mosquitto-1.6.9.tar.gz
  2. tar xzvf mosquitto-1.6.9.tar.gz
  3. cd mosquitto-1.6.9/
  4. mkdir my_build
复制代码
修改成自己的安装路径:
vim config.mk



  • 鸿蒙系统开发编译环境下(发起使用官方docker容器),为rk3568开发板编译:
  1. #配置环境变量:路径需根据实际修改
  2. //OHOS_TOOLCHAIN:是clang编译工具的实际路径
  3. //OHOS_SYSROOT:绝对路径,用于指定编译器在编译某个芯片开发板过程中所使用的标准库和头文件所在的目录, 在OpenHarmony源码执行过完整编译后的编译输出路径中找到这个目录(out/..)
  4. export OHOS_TOOLCHAIN=/home/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm
  5. export OHOS_SYSROOT=/home/openharmony/out/rk3568/obj/third_party/musl
  6. export CC=${OHOS_TOOLCHAIN}/bin/clang
  7. export CXX=${OHOS_TOOLCHAIN}/bin/clang++
  8. export AR=${OHOS_TOOLCHAIN}/bin/llvm-ar
  9. export AS=${OHOS_TOOLCHAIN}/bin/llvm-as
  10. export NM=${OHOS_TOOLCHAIN}/bin/llvm-nm
  11. export STRIP=${OHOS_TOOLCHAIN}/bin/llvm-strip
  12. export RANLIB=${OHOS_TOOLCHAIN}/bin/llvm-ranlib
  13. export LD=${OHOS_TOOLCHAIN}/bin/ld.lld
  14. unset CFLAGS
  15. unset CPPFLAGS
  16. unset LDFLAGS
  17. #编译安装,需指定openssl头文件和库路径
  18. make clean
  19. make WITH_SRV=no \
  20. CFLAGS="--target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp -I/home/openharmony/samples/sutpc_project/openssl-1.1.1a/my_build/include" \
  21. CPPFLAGS="--target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp -I/home/openharmony/samples/sutpc_project/openssl-1.1.1a/my_build/include" \
  22. LDFLAGS="--target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp --rtlib=compiler-rt -fuse-ld=lld -L/home/openharmony/samples/sutpc_project/openssl-1.1.1a/my_build/lib -lssl -lcrypto"
  23. make install
复制代码
4、编译libevent

4.1 下载源码

也可手动去官网下载:https://libevent.org
  1. wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
  2. tar -zxf libevent-2.1.12-stable.tar.gz
  3. cd libevent-2.1.12-stable/
  4. mkdir my_build
复制代码
4.2 交织编译

鸿蒙系统开发编译环境下(发起使用官方docker容器),为rk3568开发板编译
假如不必要openssl,完整编译指令:
  1. #配置环境变量:路径需根据实际修改
  2. //OHOS_TOOLCHAIN:是clang编译工具的实际路径
  3. //OHOS_SYSROOT:绝对路径,用于指定编译器在编译某个芯片开发板过程中所使用的标准库和头文件所在的目录, 在OpenHarmony源码执行过完整编译后的编译输出路径中找到这个目录(out/..)
  4. export OHOS_TOOLCHAIN=/home/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm
  5. export OHOS_SYSROOT=/home/openharmony/out/rk3568/obj/third_party/musl
  6. export CC="${OHOS_TOOLCHAIN}/bin/clang -v"
  7. #export CXX=${OHOS_TOOLCHAIN}/bin/clang++
  8. #export CPP=${OHOS_TOOLCHAIN}/bin/clang++
  9. export AR=${OHOS_TOOLCHAIN}/bin/llvm-ar
  10. export AS=${OHOS_TOOLCHAIN}/bin/llvm-as
  11. export NM=${OHOS_TOOLCHAIN}/bin/llvm-nm
  12. export STRIP=${OHOS_TOOLCHAIN}/bin/llvm-strip
  13. export RANLIB=${OHOS_TOOLCHAIN}/bin/llvm-ranlib
  14. export LD=${OHOS_TOOLCHAIN}/bin/ld.lld
  15. export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"
  16. unset CXX
  17. unset CPP
  18. export CFLAGS="-fPIC --target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"
  19. export CPPFLAGS="-fPIC --target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"
  20. //后续make编译提示找不到lc、lgcc、lgcc_s库等
  21. //所以手动导入/usr目录下的库路径,需根据实际的开发板系统,选择arm gcc路径
  22. export LIBRARY_PATH=/usr/lib/gcc-cross/arm-linux-gnueabi/7:/usr/arm-linux-gnueabi/lib
  23. #编译安装到指定目录(--prefix),暂时不考虑openssl,所以选择参数--disable-openssl
  24. ./configure --host=arm-linux \
  25. --prefix=$(pwd)/my_build \
  26. --disable-openssl
  27. make clean
  28. //后续make编译提示找不到 crti.o、crtbeginS.o、 crtendS.o、crtn.o
  29. //所以手动复制/usr目录下的这些文件到当前目录,需根据实际的开发板系统,选择arm gcc路径的文件
  30. cp /usr/lib/gcc-cross/arm-linux-gnueabi/7/crtbeginS.o ./
  31. cp /usr/lib/gcc-cross/arm-linux-gnueabi/7/crtendS.o ./
  32. cp /usr/arm-linux-gnueabi/lib/crtn.o ./
  33. cp /usr/arm-linux-gnueabi/lib/crti.o ./
  34. make V=1 -j4
  35. make install
复制代码
假如必要openssl,完整编译指令:
  1. #配置环境变量:路径需根据实际修改
  2. //OHOS_TOOLCHAIN:是clang编译工具的实际路径
  3. //OHOS_SYSROOT:绝对路径,用于指定编译器在编译某个芯片开发板过程中所使用的标准库和头文件所在的目录, 在OpenHarmony源码执行过完整编译后的编译输出路径中找到这个目录(out/..)
  4. export OHOS_TOOLCHAIN=/home/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm
  5. export OHOS_SYSROOT=/home/openharmony/out/rk3568/obj/third_party/musl
  6. export CC="${OHOS_TOOLCHAIN}/bin/clang -v"
  7. #export CXX=${OHOS_TOOLCHAIN}/bin/clang++
  8. #export CPP=${OHOS_TOOLCHAIN}/bin/clang++
  9. export AR=${OHOS_TOOLCHAIN}/bin/llvm-ar
  10. export AS=${OHOS_TOOLCHAIN}/bin/llvm-as
  11. export NM=${OHOS_TOOLCHAIN}/bin/llvm-nm
  12. export STRIP=${OHOS_TOOLCHAIN}/bin/llvm-strip
  13. export RANLIB=${OHOS_TOOLCHAIN}/bin/llvm-ranlib
  14. export LD=${OHOS_TOOLCHAIN}/bin/ld.lld
  15. //指定openssl库的路径
  16. export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld -L/home/openharmony/samples/sutpc_project/openssl-1.1.1a/my_build/lib -lssl -lcrypto"
  17. unset CXX
  18. unset CPP
  19. //指定openssl头文件路径
  20. export CFLAGS="-I/home/openharmony/samples/sutpc_project/openssl-1.1.1a/my_build/include -fPIC --target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"
  21. export CPPFLAGS="-I/home/openharmony/samples/sutpc_project/openssl-1.1.1a/my_build/include -fPIC --target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"
  22. //后续make编译提示找不到lc、lgcc、lgcc_s库等
  23. //所以手动导入/usr目录下的库路径,需根据实际的开发板系统,选择arm gcc路径
  24. export LIBRARY_PATH=/usr/lib/gcc-cross/arm-linux-gnueabi/7:/usr/arm-linux-gnueabi/lib
  25. #编译安装到指定目录(--prefix),暂时不考虑openssl,所以选择参数--disable-openssl
  26. ./configure --host=arm-linux \
  27. --prefix=$(pwd)/my_build
  28. make clean
  29. //后续make编译提示找不到 crti.o、crtbeginS.o、 crtendS.o、crtn.o
  30. //所以手动复制/usr目录下的这些文件到当前目录,需根据实际的开发板系统,选择arm gcc路径的文件
  31. cp /usr/lib/gcc-cross/arm-linux-gnueabi/7/crtbeginS.o ./
  32. cp /usr/lib/gcc-cross/arm-linux-gnueabi/7/crtendS.o ./
  33. cp /usr/arm-linux-gnueabi/lib/crtn.o ./
  34. cp /usr/arm-linux-gnueabi/lib/crti.o ./
  35. make V=1 -j4
  36. make install
复制代码
4.3 过程中出现的问题总结

make编译提示找不到lc、lgcc、lgcc_s库,crti.o、crtbeginS.o、 crtendS.o、crtn.o等:



先使用clang -v查察当前clang当前依靠系统内里的哪个gcc版本(我的是版本7):
再探求/usr/目次下这些库的路径:
  1. find /usr/ -name libgcc_s*
  2. find /usr/ -name libc.so*
复制代码

因为当前clang依靠的是gcc 7版本,而且我们是为arm开发板编译的,所以选择arm的gcc路径
手动导入库路径:
  1. export LIBRARY_PATH=/usr/lib/gcc-cross/arm-linux-gnueabi/7:/usr/arm-linux-gnueabi/lib
复制代码
再次执行,lib库能找到了,还剩下 crti.o、crtbeginS.o、 crtendS.o、crtn.o
那么从编译器详细信息来看,是想将当前目次下的 crti.o、crtbeginS.o、 crtendS.o、crtn.o一起编译。(编译器打印详细信息:可在clang 背面加参数 clang -v, 在make 背面加参数make V=1)
再探求/usr/目次下这些文件的路径:
  1. find /usr/ -name crti.o
  2. find /usr/ -name crtbeginS.o
复制代码

发现文件就在我们上面手动导入LIBRARY_PATH的gcc库路径内里,因此手动复制这些文件到当前目次即可。
末了执行make,还提示:
ld.lld: error: relocation R_ARM_REL32 cannot be used against symbol bufferevent_ops_filter; recompile with -fPIC

因此,我们只必要在CFLAGS背面加-fPIC参数就好了。
更新环境变量:
  1. export CFLAGS="-fPIC --target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"
  2. export CPPFLAGS="-fPIC --target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"
复制代码
末了,重新执行configure更新Makefile,make clean后,再次复制crtbeginS.o等文件到当前目次下,再make就通过了。
5、编译libcurl



  • 下载源码
  1. wget https://curl.haxx.se/download/curl-7.71.1.tar.gz
  2. tar -zxf curl-7.71.1.tar.gz
  3. cd curl-7.71.1
  4. mkdir my_build
复制代码


  • 鸿蒙系统开发编译环境下(发起使用官方docker容器),为rk3568开发板编译:
  1. #配置环境变量:路径需根据现实修改//OHOS_TOOLCHAIN:是clang编译工具的现实路径//OHOS_SYSROOT:绝对路径,用于指定编译器在编译某个芯片开发板过程中所使用的标准库和头文件所在的目次, 在OpenHarmony源码执行过完整编译后的编译输出路径中找到这个目次(out/..)export OHOS_TOOLCHAIN=/home/openharmony/prebuilts/clang/ohos/linux-x86_64/llvmexport OHOS_SYSROOT=/home/openharmony/out/rk3568/obj/third_party/muslexport CC=${OHOS_TOOLCHAIN}/bin/clangexport AR=${OHOS_TOOLCHAIN}/bin/llvm-arexport AS=${OHOS_TOOLCHAIN}/bin/llvm-asexport NM=${OHOS_TOOLCHAIN}/bin/llvm-nmexport STRIP=${OHOS_TOOLCHAIN}/bin/llvm-stripexport RANLIB=${OHOS_TOOLCHAIN}/bin/llvm-ranlibexport LD=${OHOS_TOOLCHAIN}/bin/ld.lldexport LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"unset CPPunset CXXexport CFLAGS="-fPIC --target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"
  2. export CPPFLAGS="-fPIC --target=arm-linux-ohos --sysroot=${OHOS_SYSROOT} -march=armv7-a -mfloat-abi=softfp"//后续make编译提示找不到lc、lgcc、lgcc_s库等//所以手动导入/usr目次下的库路径,需根据现实的开发板系统,选择arm gcc路径export LIBRARY_PATH=/usr/lib/gcc-cross/arm-linux-gnueabi/7:/usr/arm-linux-gnueabi/lib#编译安装到指定目次(--prefix),需指定openssl头文件和库路径(--with-ssl)./configure --host=arm-linux \--target=arm-linux-ohos \--prefix=$(pwd)/my_build \--with-ssl=/home/openharmony/samples/sutpc_project/openssl-1.1.1a/my_build \--enable-shared --enable-staticmake clean//后续make编译提示找不到 crti.o、crtbeginS.o、 crtendS.o、crtn.o//所以手动复制/usr目次下的这些文件到当前lib/目次下,需根据现实的开发板系统,选择arm gcc路径的文件cp /usr/lib/gcc-cross/arm-linux-gnueabi/7/crtbeginS.o lib/cp /usr/lib/gcc-cross/arm-linux-gnueabi/7/crtendS.o lib/cp /usr/arm-linux-gnueabi/lib/crtn.o lib/cp /usr/arm-linux-gnueabi/lib/crti.o lib/make -j4make install
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表