超简洁的群晖交叉编译教程
最近把一个群晖的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到群晖上看一下:
Linux my-nas 3.10.105
我这个是3.10.105的,没有这个对应的,所以下了3.10.102的。
复制下载地址,在Ubuntu上:
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让系统能够找到你的工具链
这样基本环境就弄好了,剩下的就是编译你需要的程序。
先去下载别人的源码,然后生成Makefile,别人源码可能会采用采用autogen.sh、bootstrap或者configure,这种项目的根目录里会有一个autogen.sh、bootstrap或者configure文件。如果存在前两者的话,它们就是用来辅助生成configure的,然后再由configure来生成Makefile。有些项目同时带有autogen/bootstrap以及configure,这种一般是预先已经生成了configure文件的,可以先拿它的configure执行下面的步骤,不行的话再执行autogen/bootstrap来重新生成configure。
这时候可能需要安装automake等工具。
带参数执行configure生成Makefile
其中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=<前缀>
,例如
或者在你的makefile里面添加,不熟,自己去查。
或者更简单的要直接编译源文件:
另外,如果目标平台存储空间有限,需要压缩编译出的可执行文件的的大小的话,用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.
这玩意在嵌入式的交叉编译中有奇效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)