linux下編譯arm64可執行程序
- 一.gn ninja安裝
- 二.交叉編譯工具鏈安裝
- 1.arm交叉編譯工具
- 2.安裝arm64編譯器
- 三. gn文件添加arm及arm64工具鏈
- 四.編譯驗證
本文以gn nijia安裝中demo為例,將其編譯為在arm64(rk_3568_a開發板)環境下可運行的程序
一.gn ninja安裝
安裝gn ninja,參考文章gn nijia安裝
二.交叉編譯工具鏈安裝
1.arm交叉編譯工具
arm交叉編譯工具鏈為: arm-linux-gnueabihf,官網有編譯好的二進制文件,直接下載解壓即可
1.創建目錄存放下載的文件
mkdir ~/linux/tools&&cd ~/linux/tools
2.下載交叉編譯鏈 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
wget https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
3./usr/local下創建目錄并將其解壓到該目錄下
sudo mkdir /usr/local/arm&&sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz -C /usr/local/arm
4.配置環境變量
sudo vim ~/.bashr
在最下面添加一行
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
環境變量立即生效
source ~/.bashrc
5.安裝其他庫
sudo apt-get install lsb-core lib32stdc++6
6.查看安裝是否成功
arm-linux-gnueabihf-gcc -v
輸出
ubuntu:~/Downloads/gn_test$ arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/4.9.4/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/snapshots/gcc-linaro-4.9-2017.01/configure SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-objc-gc --enable-shared --without-included-gettext --enable-nls --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --with-float=hard --with-mode=thumb --with-tune=cortex-a9 --with-arch=armv7-a --with-fpu=vfpv3-d16 --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/sysroots/arm-linux-gnueabihf --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabihf/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 4.9.4 (Linaro GCC 4.9-2017.01)
2.安裝arm64編譯器
步驟與安裝arm編譯鏈相同
1.創建目錄存放下載的文件并進入
mkdir ~/linux/tools&&cd ~/linux/tools
2.下載交叉編譯鏈 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
3./usr/local下創建目錄并將其解壓到該目錄下
sudo mkdir /usr/local/arm64&&sudo tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /usr/local/arm
4.配置環境變量
sudo vim ~/.bashr
在最下面添加一行
export PATH=$PATH:/usr/local/arm64gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
環境變量立即生效
source ~/.bashrc
5.驗證是否安裝成功
ubuntu:~/linux/tools$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/local/arm64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/7.5.0/lto-wrapper
Target: aarch64-linux-gnu
Configured with: '/home/tcwg-buildslave/workspace/tcwg-make-release_0/snapshots/gcc.git~linaro-7.5-2019.12/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 7.5.0 (Linaro GCC 7.5-2019.12)
三. gn文件添加arm及arm64工具鏈
修改gn nijia安裝中的toolchain目錄下的BUILD.gn文件
修改為下面內容
toolchain("arm") {toolprefix = "arm-linux-gnueabihf-"cc = "${toolprefix}gcc"cxx = "${toolprefix}g++"ar = "${toolprefix}ar"
# #ld = cxx
# #readelf = "${toolprefix}readelf"
# #nm = "${toolprefix}nm"
#
# toolchain_args = {
# current_cpu = "arm"
# current_os = "linux"
# is_clang = false
# }tool("cc") {depfile = ".d"command = "${cc} -MMD -MF $depfile -c {{source}} -o {{output}}"depsformat = "gcc"description = "CXX"outputs = ["{{target_output_name}}.{{source_name_part}}.o",]}tool("cxx") {depfile = ".d"command = "${cxx} -MMD -MF $depfile -c {{source}} -o {{output}}"depsformat = "gcc"description = "CXX"outputs = ["{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",]}tool("link") {outfile = "{{output_dir}}/bin/{{target_output_name}}{{output_extension}}"rspfile = "{{output}}.rsp"command = "${cxx} -o $outfile @$rspfile"description = "LINK $outfile"rspfile_content = "{{inputs}}"outputs = [outfile,]default_output_dir = "{{root_out_dir}}"}tool("solink") {soname = ""sofile = "/$soname"rspfile = "{{output}}.rsp"command = "${cxx} -shared -o $sofile -Wl, -soname=$soname @$rspfile"description = "SOLINK $soname"rspfile_content = "{{inputs}}"outputs = [sofile,]default_output_extension = ".so"default_output_dir = ""link_output = sofiledepend_output = sofileoutput_prefix = "lib"}tool("alink") {rspfile = "{{output}}.rsp"command = "${ar} rcs {{output}} @\"$rspfile\""description = "AR"rspfile_content = "{{inputs}}"outputs = ["{{target_out_dir}}/{{target_output_name}}{{output_extension}}",]default_output_extension = ".a"output_prefix = "lib"}}toolchain("arm64") {toolprefix = "aarch64-linux-gnu-"cc = "${toolprefix}gcc"cxx = "${toolprefix}g++"ar = "${toolprefix}ar"#ld = cxx#readelf = "${toolprefix}readelf"#nm = "${toolprefix}nm"#toolchain_args = {# current_cpu = "arm64"# current_os = "linux"# is_clang = false#}tool("cc") {depfile = ".d"command = "${cc} -MMD -MF $depfile -c {{source}} -o {{output}}"depsformat = "gcc"description = "CXX"outputs = ["{{target_output_name}}.{{source_name_part}}.o",]}tool("cxx") {depfile = ".d"command = "${cxx} -MMD -MF $depfile -c {{source}} -o {{output}}"depsformat = "gcc"description = "CXX"outputs = ["{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",]}tool("link") {outfile = "{{output_dir}}/bin/{{target_output_name}}{{output_extension}}"rspfile = "{{output}}.rsp"command = "${cxx} -o $outfile @$rspfile"description = "LINK $outfile"rspfile_content = "{{ldflags}} {{inputs}}"outputs = [outfile,]default_output_dir = "{{root_out_dir}}"}tool("solink") {soname = ""sofile = "/$soname"rspfile = "{{output}}.rsp"command = "${cxx} -shared -o $sofile -Wl, -soname=$soname @$rspfile"description = "SOLINK $soname"rspfile_content = "{{ldflags}} {{inputs}}"outputs = [sofile,]default_output_extension = ".so"default_output_dir = ""link_output = sofiledepend_output = sofileoutput_prefix = "lib"}tool("alink") {rspfile = "{{output}}.rsp"command = "${ar} rcs {{output}} @\"$rspfile\""description = "AR"rspfile_content = "{{inputs}}"outputs = ["{{target_out_dir}}/{{target_output_name}}{{output_extension}}",]default_output_extension = ".a"output_prefix = "lib"}}
修改BUILDCONFIG.gn文件,將工具鏈指向arm64
set_default_toolchain("//build/toolchain:arm64")
修改與main.cc同目錄下的BUILD.gn文件,使用靜態編譯,避免鏈接器不同導致的無法執行問題
# 聲明一個可執行文件目標
executable("hello") {# 源文件列表sources = [ "main.cc" ]# 編譯選項(可選)cflags = ["-Wall","-Werror",]# 鏈接選項(可選)ldflags = [ "-static"]
}
四.編譯驗證
在main.cc所在目錄下執行如下命令
gn gen out/arm64 --args='target_cpu="arm64"'
ninja -v -C out/arm64/
生成的目標文件位于out/arm64/bin
目錄下
file查看該文件屬性
@ubuntu:~/Downloads/gn_test$ file out/arm64/bin/hello
out/arm64/bin/hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.7.0, BuildID[sha1]=2e4c0e468fd229cb5875041d4afb5a529cd41206, with debug_info, not stripped
將該文件推送到arm64環境下,添加可執行權限并執行
# chmod a+x hello
# ./hello
Hello, World!
成功運行
參考:
https://www.jianshu.com/p/5d762cca83a0
https://blog.csdn.net/p1279030826/article/details/105021536