超简洁的群晖交叉编译教程

超简洁的群晖交叉编译教程

最近把一个群晖的NAS放在校园网里的时候遇到了锐捷认证的问题,找了一下没有现成的程序可以拿来用,然后自己交叉编译一个mentohust来用。

1.环境

Ubuntu20.04,先去下载目标机器对应的toolchain(就是用来编译目标平台的程序的编译工具套装,gcc、g++、ld和库啥的)。
群晖的开发工具下载首页,进入DMS相应版本的目录里,比如我的是6.2.3版本,进去DSM 6.2 Tool Chains,然后可以看到有很多对应着不同处理器的压缩包,找和你CPU对应的版本。这个对应关系我没弄全,自己查一下资料,比如,我的是intel的CPU,肯定是intel x86,然后后面是Linux版本,这个要ssh到群晖上看一下:

# uname -a
Linux my-nas 3.10.105 #25426 SMP Wed Jul 8 03:19:42 CST 2020 x86_64 GNU/Linux synology_broadwell_rs3618xs

我这个是3.10.105的,没有这个对应的,所以下了3.10.102的。
复制下载地址,在Ubuntu上:

# wget https://master.dl.sourceforge.net/project/dsgpl/DSM%206.2%20Tool%20Chains/Intel%20x86%20Linux%203.10.102%20%28Broadwell%29/broadwell-gcc493_glibc220_linaro_x86_64-GPL.txz
# tar -Jvxf broadwell-gcc493_glibc220_linaro_x86_64-GPL.txz
# cd x86_64-pc-linux-gnu/bin
# ls
x86_64-pc-linux-gnu-addr2line  x86_64-pc-linux-gnu-cc            x86_64-pc-linux-gnu-elfedit    x86_64-pc-linux-gnu-gcc-ar      x86_64-pc-linux-gnu-gprof   x86_64-pc-linux-gnu-nm        x86_64-pc-linux-gnu-ranlib   x86_64-pc-linux-gnu-strip
x86_64-pc-linux-gnu-ar         x86_64-pc-linux-gnu-c++filt       x86_64-pc-linux-gnu-g++        x86_64-pc-linux-gnu-gcc-nm      x86_64-pc-linux-gnu-ld      x86_64-pc-linux-gnu-objcopy   x86_64-pc-linux-gnu-readelf
x86_64-pc-linux-gnu-as         x86_64-pc-linux-gnu-cpp           x86_64-pc-linux-gnu-gcc        x86_64-pc-linux-gnu-gcc-ranlib  x86_64-pc-linux-gnu-ld.bfd  x86_64-pc-linux-gnu-objdump   x86_64-pc-linux-gnu-size
x86_64-pc-linux-gnu-c++        x86_64-pc-linux-gnu-ct-ng.config  x86_64-pc-linux-gnu-gcc-4.9.3  x86_64-pc-linux-gnu-gcov        x86_64-pc-linux-gnu-ldd     x86_64-pc-linux-gnu-populate  x86_64-pc-linux-gnu-strings
可以看到gcc相关的可执行程序,这时候可以验证一下下的程序对不对,运行一个试试。
然后把bin目录添加到PATH让系统能够找到你的工具链
# export PATH=$PATH:你的工具包的目录/x86_64-pc-linux-gnu/bin

这样基本环境就弄好了,剩下的就是编译你需要的程序。

先去下载别人的源码,然后生成Makefile,别人源码可能会采用采用autogen.sh、bootstrap或者configure,这种项目的根目录里会有一个autogen.sh、bootstrap或者configure文件。如果存在前两者的话,它们就是用来辅助生成configure的,然后再由configure来生成Makefile。有些项目同时带有autogen/bootstrap以及configure,这种一般是预先已经生成了configure文件的,可以先拿它的configure执行下面的步骤,不行的话再执行autogen/bootstrap来重新生成configure。
这时候可能需要安装automake等工具。

# apt-get install autoconf automake libtool

带参数执行configure生成Makefile

# ./configure --host=x86_64-pc-linux-gnu [这里可能还有你的程序的其他配置参数]

其中host就是目标机器平台了,这个对应着工具链bin目录下文件共有的前缀,比如前面ls命令输出的那些gcc之类的,x86_64-pc-linux-gnu是它们的前缀。
configure不出错的话下一步就是执行make进行编译,编译的输出自己去找一下。有些也可以在configure里设置安装目录,然后make完再make install就会安装到设置的目录了。
编译中出现的其他问题,请在google\stackoverflow\github的issues里面找解决办法。

完工


更新
评论区的问题提醒了我增加一些,可能你要编译的项目没有configure这些,直接make就行的,那样就需要在make的时候在参数里指定目标平台:
make CROSS_COMPILE=<前缀>,例如

# make CROSS_COMPILE=x86_64-pc-linux-gnu

或者在你的makefile里面添加,不熟,自己去查。
或者更简单的要直接编译源文件:

# x86_64-pc-linux-gcc main.c

另外,如果目标平台存储空间有限,需要压缩编译出的可执行文件的的大小的话,用x86_64-pc-linux-gnu-strip:

  • strip is often used to remove some symbol table and debug symbol table information from the target file, so as to reduce the size of static library, dynamic library and program.

这玩意在嵌入式的交叉编译中有奇效。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值