arm-linux-cc 4

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2 glib缺少libmount

meson 在build之前会检查每个项目的依赖,依赖检查完毕后才会开始编译。检查glib依赖的时候出现了libmount找不到错误,错误信息如下。

glib| Run-time dependency mount found: NO
subprojects/glib/meson.build:1868:2: ERROR: Pkg-config binary for machine MachineChoice.HOST not found. Giving up.

找到对应的meson 文件,发现确实在检测libmount时失败。

libmount_dep = []
if host_system == 'linux' and get_option('libmount')
  libmount_dep = [dependency('mount', version : '>=2.23', required : true)]
  glib_conf.set('HAVE\_LIBMOUNT', 1)
endif

目前我接触到的meson添加依赖项的方式有两种(应该还有其他方式,暂时未接触到)。第一种就是通过 dependency关键字添加依赖,这类依赖一般是编译安装好的lib,和我们用cmake添加lib没什么区别。第二种方法也是meson比较强大的地方,它可以把依赖项目的源码下载在项目,编译的时候直接作为一个子项目编译,这就是为什么我们使用meson编译的时候会自动下载依赖项目;这种方式添加依赖时使用subproject关键字,并且项目种要有对应的wrap文件指明项目clone的地址。
上面的libmount是通过dependency添加的依赖,所以需要手动交叉编译安装到toolchain路径下。libmount不是单独lib,包含在util-linux中,所需要下载编译util-linux。

1 下载代码
并切换到v2.32分支是因为master 分支使用了meson编译,会有编译错误,所以还是使用makefile的方式。

git clone https://github.com/karelzak/util-linux.git
git checkout -b stable/v2.32

2 第一次编译
util-linux子项目之间有依赖关系,所以需要逐个编译安装,不编译某个lib时可以使用–disable配置,如–disable-libuuid,第一次编译的时候需要把大部分lib都关闭掉才能编译通过。

./autogen.sh

然后配置makefile

./configure CC=arm-none-linux-gnueabi-gcc \
CXX=arm-none-linux-gnueabi-g++ \
--prefix=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi \
--host=arm-none-linux-gnueabi \
--target=arm-none-linux-gnueabi  \
--without-python --without-tinfo --without-ncursesw \
--without-ncurses --without-systemd --without-libblkid  \
--disable-libblkid --disable-login-utils \
--disable-libuuid --disable-libfdisk

配置完后执行编译安装命令。

make
make install

执行make install的时候遇到了如下错误:

./libtool: line 1719: arm-none-linux-gnueabi-ranlib: command not found
Makefile:5118: recipe for target 'install-usrlib\_execLTLIBRARIES' failed

出现错误的原因可以参考这篇文章make install时"arm-linux-ranlib command not found",参照里面的方案切换成root用户执行install:

sudo su
make install

install完成后记得不要忘了切换回原来的用户。

su usename

3 重新配置makefile,编译出libuuid。

./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ \
--prefix=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi \
--host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi  \
--without-python --without-tinfo --without-ncursesw \
--without-ncurses --without-systemd \
-disable-libmount --disable-libblkid --disable-libfdisk

然后执行make install ,install 之前同样要使用su命令。之所以先编译libuuid是因为libfdisk和libblkid的编译依赖libuuid,否则会出现如下错误:

./.libs/libblkid.so: undefined reference to `uuid_unparse@UUID_1.0'
collect2: ld returned 1 exit status
Makefile:5977: recipe for target 'blkid' failed

4 编译libblkid,因为libfdisk的编译依赖libblkid。

./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ \
--prefix=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi \
--host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi  \
--without-python --without-tinfo --without-ncursesw --without-ncurses \
--without-systemd -disable-libmount --disable-libfdisk

5 编译libfdisk,libmount的编译依赖libfdisk。

./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ \
--prefix=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi \
--host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi  \
--without-python --without-tinfo --without-ncursesw --without-ncurses \
--without-systemd -disable-libmount 

6 编译libmount

./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ \
--prefix=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi \
--host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi  \
--without-python --without-tinfo --without-ncursesw --without-ncurses \
--without-systemd

终于编译除了libmount,像俄罗斯套娃一样。note:如果编译的时候某个项目缺少依赖的lib,可以先disable该项目,先编译出依赖再开启。
libmount install完成后重新配置meson,但是仍然会出现找不到该lib的错误。

glib| Run-time dependency mount found: NO
subprojects/glib/meson.build:1868:2: ERROR: Pkg-config binary for machine MachineChoice.HOST not found. Giving up.

install 仍然找不到lib是因为pkgconfig文件路径不正确,pkgconfig文件的后缀名是.pc,里面指明了该lib的头文件以及so地址,如mount.pc。

prefix=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi
exec\_prefix=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi
libdir=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib
includedir=/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/include

Name: mount
Description: mount library
Version: 2.32.1
Requires.private: blkid
Cflags: -I${includedir}/libmount
Libs: -L${libdir} -lmount

之前编译的libmount install 在了toolchain目录,所以在cross_file.txt中更新pkgconfig路径。

[properties]
pkg_config_libdir = ['/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib/pkgconfig']

[binaries]
c = 'arm-none-linux-gnueabi-gcc'
cpp = 'arm-none-linux-gnueabi-g++'
ar = 'arm-none-linux-gnueabi-ar'
strip = 'arm-none-linux-gnueabi-strip'
pkgconfig = 'pkg-config'

[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'ARM9'
endian = 'little'

[build_machine]
system = 'linux'
cpu_family = 'x86\_64'
cpu = 'i686'
endian = 'little'

更新pkgconfig就可以meson配置时就可以检测到该lib了,会出现以下log。

Run-time dependency mount found: YES 2.32.1

3 gst-omx配置错误

meson 配置gst-omx时会出现以下错误:

subprojects/gst-omx/meson.build:220:2: ERROR: Problem encountered: Unsupported omx target specified. Use the -Dtarget option

原因option 中target参数没有指定的原因,所以通过-D参数修改subprojects/gst-omx目录下meson_option.txt中target选项。

meson build --cross-file cross_file.txt -D gst-omx:target=rpi 

不出意外的话这次会配置成功,会出现以下log:

All GStreamer modules 1.18.5.1

  Subprojects
    FFmpeg                    : YES 12 warnings
    avtp                      : YES
    dssim                     : NO Dependency "libpng" not found, tried pkgconfig
    gl-headers                : YES
    glib                      : YES 4 warnings
    glib-networking           : NO Problem encountered: No TLS backends enabled. Please enable at least one TLS backend
    gst-devtools              : YES
    gst-editing-services      : NO Feature 'ges' disabled
    gst-examples              : YES
    gst-integration-testsuites: YES
    gst-libav                 : YES
    gst-omx                   : NO Feature 'omx' disabled
    gst-plugins-bad           : YES 1 warnings
    gst-plugins-base          : YES 2 warnings
    gst-plugins-good          : YES 2 warnings
    gst-plugins-rs            : NO Feature 'rs' disabled
    gst-plugins-ugly          : NO Requested variable "plugins\_cache\_generator" not found.
    gst-python                : NO Subproject "subprojects/pygobject" required but not found.
    gst-rtsp-server           : YES
    gstreamer                 : YES 3 warnings
    gstreamer-sharp           : NO Feature 'sharp' disabled
    gstreamer-vaapi           : NO Feature 'vaapi' disabled
    json-glib                 : YES
    libdrm                    : YES
    libffi                    : YES
    libmicrodns               : YES
    libnice                   : NO Problem encountered: Either GnuTLS or OpenSSL is required as crypto library, but neither was found
    libopenjp2                : NO Dependency "wxWidgets" not found, tried config-tool
    libpsl                    : YES
    libsoup                   : YES 4 warnings
    libxml2                   : YES
    openh264                  : NO Program 'nasm nasm.exe' not found
    openssl                   : NO Neither a subproject directory nor a openssl.wrap file was found.
    orc                       : YES 3 warnings
    pygobject                 : NO Python dependency not found
    sqlite                    : YES
    tinyalsa                  : NO Neither a subproject directory nor a tinyalsa.wrap file was found.
    x264                      : YES

Found ninja-1.10.2.git.kitware.jobserver-1 at /usr/local/bin/ninja

3 编译过程中遇到的问题

配置成功后可以执行编译命令:

ninja -C build

编译的过程中遇到了不少问题,逐一记录解决方案。

1 编译glib失败

编译glib中遇到了以下错误:

../subprojects/glib/glib/gnulib/xsize.h:65: error: no previous prototype for 'xsum'
../subprojects/glib/glib/gnulib/xsize.h:76: error: no previous prototype for 'xsum3'
../subprojects/glib/glib/gnulib/xsize.h:86: error: no previous prototype for 'xsum4'
../subprojects/glib/glib/gnulib/xsize.h:96: error: no previous prototype for 'xmax'

解决方案可以参考arm-linux-cc 4.4.3 交叉编译glib 2.70.1
直接subprojects/glib目录meson.build文件中加一句use_system_printf = true,强制使用系统print,不编译vasnprintf。

# Our printf is 'good' only if vsnpintf()/snprintf()/printf() supports C99 well enough
use_system_printf = have_good_vsnprintf and have_good_snprintf and have_good_printf
use_system_printf = true
glib_conf.set('USE\_SYSTEM\_PRINTF', use_system_printf)
glibconfig_conf.set('GLIB\_USING\_SYSTEM\_PRINTF', use_system_printf)

2 编译gst-plugins-base遇到“declarations are only allowed in C99 mode”错误

错误信息如下:

../subprojects/gst-plugins-base/gst-libs/gst/video/gstvideoaggregator.c:2772: error: 'for' loop initial declarations are only allowed in C99 mode
../subprojects/gst-plugins-base/gst-libs/gst/video/gstvideoaggregator.c:2772: note: use option -std=c99 or -std=gnu99 to compile your code

出现错误的原因是gcc是基于c89标准的,而C89标准不支持循环语句如下这样定义:

for(int i=0; i<len; i++) {}

必须要写成下面这样:

int i;
for(i=0;i<len;i++){}

卧底个乖乖,难道要逐一改用到for循环的源码吗,那岂不是要人命!当然不是,编译的时候可以通过添加参数换成gnu99标准就可以了,编译单个文件可以这样写:

gcc src.c -std=gnu99 -o src

meson 编译在cross_file.txt中添加参数就可以了,更改后文件如下:

[properties]
pkg_config_libdir = ['/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib/pkgconfig', '/home/zhy/code/toolchain\_lib/lib/pkgconfig']
c_args = ['-std=gnu99']

[binaries]
c = 'arm-none-linux-gnueabi-gcc'
cpp = 'arm-none-linux-gnueabi-g++'
ar = 'arm-none-linux-gnueabi-ar'
strip = 'arm-none-linux-gnueabi-strip'
pkgconfig = 'pkg-config'

[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'ARM9'
endian = 'little'

[build_machine]
system = 'linux'
cpu_family = 'x86\_64'
cpu = 'x86\_64'
endian = 'little'

3 编译gst-plugins-good遇到“‘O_CLOEXEC’ undeclared”错误

错误信息入下:

../subprojects/gst-plugins-good/sys/v4l2/gstv4l2object.c:3032: error: 'O\_CLOEXEC' undeclared (first use in this function)
../subprojects/gst-plugins-good/sys/v4l2/gstv4l2object.c:3032: error: (Each undeclared identifier is reported only once
../subprojects/gst-plugins-good/sys/v4l2/gstv4l2object.c:3032: error: for each function it appears in.)

原因是O_CLOEXEC宏未定义,同样在cross_file.txt添加宏定义,添加后的cross_file.txt:

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值