交叉编译glib

编程入门 行业动态 更新时间:2024-10-26 13:26:32

交叉编译<a href=https://www.elefans.com/category/jswz/34/1575165.html style=glib"/>

交叉编译glib

文章目录

  • 先创建一个输出目录
  • 安装libffi
  • 安装zlib
  • 安装libconv
  • 安装 gettext
  • 交叉编译GLib
    • configure阶段报错1:
    • configure阶段报错2:
    • make阶段报错3:
    • make阶段报错4:

先创建一个输出目录

mkdir bluez_output
cd bluez_output
export bluez_output=/home/liefyuan/luckfox-pico-main/project/app/bluez/bluez_output		#设置环境变量

非常实用的操作。

安装libffi

libffi是可移植外部函数接口库,是构建GLib的先决条件。它是一个接口,允许用一种语言编写的代码调用用另一种语言编写的代码。

  • libffi下载路径:/

  • libffi下载版本:libffi-3.4.3.tar.gz

手动下载后,执行下面命令:

tar -zxvf libffi-3.4.3.tar.gz		# 解压
cd libffi-3.4.3/					# 切换目录
./configure --prefix=$bluez_output CC="/home/liefyuan/luckfox-pico-main/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" --host=arm-rockchip830-linux-uclibcgnueabihf
make -j8
make install

安装完libffi后,再次回到GLib进行安装,可见报错:fatal error: zlib.h: No such file or directory

说明GLib仍然依赖zlib库,需要安装zlib

安装zlib

zlib是一个压缩库,是构建GLib的先决条件。

zlib下载地址:.3

zlib下载版本:zlib-1.3.tar.gz

手动下载后,执行下面命令:

tar -zxvf zlib-1.3.tar.gz
cd zlib-1.3/
./configure --prefix=$bluez_output --includedir=$bluez_output/include --libdir=$bluez_output/lib

vim Makefile 将CC变量改为自己的交叉编译器arm-linux-gnueabihf-gcc

CC=/home/liefyuan/luckfox-pico-main/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc
LDSHARED=/home/liefyuan/luckfox-pico-main/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=/home/liefyuan/luckfox-pico-main/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc -E
AR=/home/liefyuan/luckfox-pico-main/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-ar
RANLIB=/home/liefyuan/luckfox-pico-main/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-ranlib
make -j8
make install

安装libconv

libiconv 在Linux的交叉编译与使用

官网:
下载地址:.17.tar.gz

手动下载以后:

tar -xzvf libiconv-1.17.tar.gz 			# 解压
cd libiconv-1.17/							# 进入目录
./configure --prefix=$bluez_output CC="/home/liefyuan/luckfox-pico-main/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" --host=arm-rockchip830-linux-uclibcgnueabihf --enable-static=yes --enable-shared=nomake -j8
make install

然后所有的都安装在bluez_output目录下了。

安装 gettext

交叉编译-20:gettext移植到君正平台

  • 下载地址:/
  • .20.tar.gz

手动下载以后:

tar -xzvf gettext-0.20.tar.gz 			# 解压
cd gettext-0.20/					    # 进入目录
./configure --prefix=$bluez_output --host=arm-rockchip830-linux-uclibcgnueabihf  CC="/home/liefyuan/luckfox-pico-main/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" CFLAGS="-fPIC" --enable-static=yes --enable-shared=nomake -j8
make install

编译花了5分钟左右。

交叉编译GLib

参考:Glib 2.45.3 交叉编译完整版

GLib 是一个通用的、可移植的实用程序库,它提供了许多有用的数据类型、宏、类型转换、字符串实用程序、文件实用程序、主循环抽象等。

新版本的GLib需要Meson工具编译,因此我们这里使用2.46.2版本的,可以通过cmake编译

wget .46/glib-2.46.2.tar.xz	#下载GLib
tar -xvf glib-2.46.2.tar.xz 			# 解压
cd glib-2.46.2/							# 进入目录

然后手动创建arm-linux.cache文件,手动写入下面内容:

touch arm-linux.cache		

创建文件, 添加下面内容

glib_cv_long_long_format=ll
glib_cv_stack_grows=no
glib_cv_working_bcopy=no
glib_cv_sane_realloc=yes
glib_cv_have_strlcpy=no
glib_cv_va_val_copy=yes
glib_cv_rtldglobal_broken=no
glib_cv_uscore=no
ac_cv_func_posix_getpwuid_r=yes
ac_cv_func_nonposix_getpwuid_r=no
ac_cv_func_posix_getgrgid_r=no
glib_cv_use_pid_surrogate=no
ac_cv_func_printf_unix98=no
ac_cv_func_vsnprintf_c99=no
ac_cv_path_GLIB_COMPILE_SCHEMAS=yes

然后接着执行下面命令:

./configure --prefix=$bluez_output CC="/home/liefyuan/luckfox-pico-main/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" --host=arm-rockchip830-linux-uclibcgnueabihf --cache-file=arm-linux.cache  --enable-static=yes --enable-shared=no
make -j8
make install

configure阶段报错1:

checking for python extension module directory... ${exec_prefix}/lib/python2.7/site-packages
checking for iconv_open... no
checking for libiconv_open in -liconv... no
checking for iconv_open in -liconv... no
configure: error: *** No iconv() implementation found in C library or libiconv

在编译GLib时,如果libiconv是手动编译到指定目录的,会导致configure无法找到iconv库,执行configure
我找到 libiconv 库的位置

/home/liefyuan/luckfox-pico-main/project/app/component/third_libs/lib/arm-rockchip830-linux-uclibcgnueabihf/libiconv.so
/home/liefyuan/luckfox-pico-main/project/app/component/third_libs/lib/arm-rockchip830-linux-uclibcgnueabihf/libiconv.so.2
/home/liefyuan/luckfox-pico-main/project/app/component/third_libs/lib/arm-rockchip830-linux-uclibcgnueabihf/libiconv.so.2.6.1

交叉编译libiconv!!

好的,不报这个错了!但是有报错2了!!

configure阶段报错2:

checking for LC_MESSAGES... yes
checking libintl.h usability... no
checking libintl.h presence... no
checking for libintl.h... no
configure: error:
*** You must have either have gettext support in your C library, or use the
*** GNU gettext library. (.html

交叉编译 gettext!!

make阶段报错3:

解决办法:gdate error: format not a string literal -Werror=format-nonliteral 错误详解

  CC       libglib_2_0_la-gdir.loCC       libglib_2_0_la-genviron.lo
gdate.c: In function 'g_date_strftime':
gdate.c:2497:7: error: format not a string literal, format string not checked [-Werror=format-nonliteral]tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm);^~~~~~CC       libglib_2_0_la-gerror.loCC       libglib_2_0_la-gfileutils.loCC       libglib_2_0_la-ggettext.loCC       libglib_2_0_la-ghash.loCC       libglib_2_0_la-ghmac.loCC       libglib_2_0_la-ghook.lo
cc1: some warnings being treated as errors
make[4]: *** [Makefile:1845: libglib_2_0_la-gdate.lo] Error 1
make[4]: *** Waiting for unfinished jobs....
make[4]: Leaving directory '/home/liefyuan/luckfox-pico-main/project/app/bluez/glib-2.46.2/glib'
make[3]: *** [Makefile:2511: all-recursive] Error 1
make[3]: Leaving directory '/home/liefyuan/luckfox-pico-main/project/app/bluez/glib-2.46.2/glib'
make[2]: *** [Makefile:1224: all] Error 2
make[2]: Leaving directory '/home/liefyuan/luckfox-pico-main/project/app/bluez/glib-2.46.2/glib'
make[1]: *** [Makefile:1212: all-recursive] Error 1
make[1]: Leaving directory '/home/liefyuan/luckfox-pico-main/project/app/bluez/glib-2.46.2'
make: *** [Makefile:854: all] Error 2

ChatGPT解释到:这个错误提示意味着在代码中的g_date_strftime函数的调用中,locale_format参数作为格式字符串传递给了strftime函数,但是编译器警告这种用法可能存在潜在的安全问题。由于这个参数不是编译时固定的字符串,编译器无法在编译时对其进行格式检查。编译器给出了-Werror=format-nonliteral选项,将这个警告视为错误。
这种警告的目的是防止可能的格式字符串漏洞,其中攻击者可以通过传递恶意格式字符串来执行任意代码。为了解决这个问题,你可以使用字符串常量作为格式字符串,或者对传递给strftime函数的格式字符串进行其他安全验证。这样编译器就能够对格式字符串进行静态检查,减少潜在的安全风险。

解决办法:.html
编辑报错的文件

 vim ./glib/gdate.c

添加如下代码

#pragma GCC diagnostic ignored "-Wformat-nonliteral"

就在包含头文件的地方加就行了

make阶段报错4:

  CCLD     gresource
/home/liefyuan/luckfox-pico-main/project/app/bluez/bluez_output/lib/libz.so: file not recognized: file format not recognized
collect2: error: ld returned 1 exit status
make[4]: *** [Makefile:2121: gio-querymodules] Error 1
make[4]: *** Waiting for unfinished jobs....
/home/liefyuan/luckfox-pico-main/project/app/bluez/bluez_output/lib/libz.so: file not recognized: file format not recognized
collect2: error: ld returned 1 exit status
/home/liefyuan/luckfox-pico-main/project/app/bluez/bluez_output/lib/libz.so: file not recognized: filemake[4]: *** [Makefile:2125: glib-compile-resources] Error 1format not recognized
collect2: error: ld returned 1 exit status

xxx.dll: file not recognized: file format not recognized
collect2.exe: error: ld returned 1 exit status
出现类似错误一般是动态链接库版本(32位/64位)不对的问题造成的。

读了一下文件,吓我一跳!

$ file libz.so.1.3
libz.so.1.3: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5382c6bb50b8ff4685d2f9d49ef3678f77e530f8, not stripped

说明zlib没有编译好!重新编译安装OK!

更多推荐

交叉编译glib

本文发布于:2023-12-06 17:13:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1668258.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:glib

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!