在使用之前需要先source env,導入各種環境變量(注意將路徑變更成你自己的):
~~~
source ../qt5_sdk/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
~~~
然后我們可以查看一下bash的env了,下面是多出來的一些env,直接在bash中輸入export即可看到:
~~~
declare -x AR="arm-poky-linux-gnueabi-ar"
declare -x ARCH="arm"
declare -x AS="arm-poky-linux-gnueabi-as "
declare -x CC="arm-poky-linux-gnueabi-gcc -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/media/work/iMX6/Yocto/qt5_sdk/sysroots
/cortexa9hf-vfp-neon-poky-linux-gnueabi"
declare -x CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
declare -x CONFIGURE_FLAGS="--target=arm-poky-linux-gnueabi --host=arm-poky-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=/media/work/iMX6/Yocto/qt5_sdk/sysro
ots/cortexa9hf-vfp-neon-poky-linux-gnueabi"
declare -x CONFIG_SITE="/media/work/iMX6/Yocto/qt5_sdk/site-config-cortexa9hf-vfp-neon-poky-linux-gnueabi"
declare -x CPP="arm-poky-linux-gnueabi-gcc -E -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/media/work/iMX6/Yocto/qt5_sdk/sysr
oots/cortexa9hf-vfp-neon-poky-linux-gnueabi"
declare -x CPPFLAGS=""
declare -x CROSS_COMPILE="arm-poky-linux-gnueabi-"
declare -x CXX="arm-poky-linux-gnueabi-g++ -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/media/work/iMX6/Yocto/qt5_sdk/sysroot
s/cortexa9hf-vfp-neon-poky-linux-gnueabi"
declare -x CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
declare -x M4="m4"
declare -x MANDATORY_PATH="/usr/share/gconf/kde-plasma.mandatory.path"
declare -x NM="arm-poky-linux-gnueabi-nm"
declare -x OBJCOPY="arm-poky-linux-gnueabi-objcopy"
declare -x OBJDUMP="arm-poky-linux-gnueabi-objdump"
declare -x OECORE_ACLOCAL_OPTS="-I /media/work/iMX6/Yocto/qt5_sdk/sysroots/x86_64-pokysdk-linux/usr/share/aclocal"
declare -x OECORE_DISTRO_VERSION="1.7"
declare -x OECORE_NATIVE_SYSROOT="/media/work/iMX6/Yocto/qt5_sdk/sysroots/x86_64-pokysdk-linux"
declare -x OECORE_SDK_VERSION="1.7"
declare -x OECORE_TARGET_SYSROOT="/media/work/iMX6/Yocto/qt5_sdk/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi"
declare -x OLDPWD="/media/work/iMX6/Yocto/video2lcd_arm/test"
declare -x PATH="/media/work/iMX6/Yocto/qt5_sdk/sysroots/x86_64-pokysdk-linux/usr/bin:/media/work/iMX6/Yocto/qt5_sdk/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi:/home/hexiongjun/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/hexiongjun/010editor:/home/hexiongjun/010editor"
declare -x PKG_CONFIG_PATH="/media/work/iMX6/Yocto/qt5_sdk/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/lib/pkgconfig"
declare -x PKG_CONFIG_SYSROOT_DIR="/media/work/iMX6/Yocto/qt5_sdk/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi"
declare -x PWD="/media/work/iMX6/Yocto/video2lcd_arm"
declare -x PYTHONHOME="/media/work/iMX6/Yocto/qt5_sdk/sysroots/x86_64-pokysdk-linux/usr"
declare -x QMAKESPEC="/home/hexiongjun/github/BBB/SDK/ti-sdk-am335x-evm-05.07.00.00/linux-devkit/arm-arago-linux-gnueabi/usr/share/qtopia/mkspecs/linux-g++"
declare -x QT_IM_MODULE="fcitx"
declare -x QT_PLUGIN_PATH="/home/hexiongjun/.kde/lib/kde4/plugins/:/usr/lib/kde4/plugins/"
declare -x RANLIB="arm-poky-linux-gnueabi-ranlib"
declare -x SDKTARGETSYSROOT="/media/work/iMX6/Yocto/qt5_sdk/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi"
declare -x SESSION_MANAGER="local/hexiongjun-pc:@/tmp/.ICE-unix/3595,unix/hexiongjun-pc:/tmp/.ICE-unix/3595"
~~~
## 注意點
其中我們重點需要關注的是與編譯相關的變量:
1. CC/LD等編譯相關
1. ARCH/CROSS_COMPILE等croos編譯相關
可以看到CC已經被重定義為cross toolchain了,而ARCH和CROSS_COMPILE也悉心的幫我們配置成了對應的。
因此,其實如果我們需要交叉編譯一個app,那么很多變量將不再需要自己手動設定了。
同時因為各種tuning的指定,我們必須注意和硬件的匹配。例如這里指定了為cortex-a9而優化。
## 如何使用
最好的方法就是使用變量來使用Toolchian,例如使用$CC而不是使用arm-poky-XXX-gcc,因為我們可以看到CC其實是對arm-xxx-gcc添加了一些配置:
~~~
CC="arm-poky-linux-gnueabi-gcc -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/media/work/iMX6/Yocto/qt5_sdk/sysroots
/cortexa9hf-vfp-neon-poky-linux-gnueabi"
~~~
其中最為核心的是sysroot這個選項,這個選項將告訴toolchian去哪里查找庫與頭文件,而如果不指定這個,那么就會出現問題,例如,我們直接使用arm-poky-gnueabi-gcc來編譯:
~~~
$ make
make -C ./ -f /media/work/iMX6/Yocto/video2lcd_arm/Makefile.build
make[1]: Entering directory `/media/work/iMX6/Yocto/video2lcd_arm'
make -C convert -f /media/work/iMX6/Yocto/video2lcd_arm/Makefile.build
make[2]: Entering directory `/media/work/iMX6/Yocto/video2lcd_arm/convert'
arm-poky-linux-gnueabi-gcc -Wall -Werror -O2 -g -I /media/work/iMX6/Yocto/video2lcd_arm/include -I /media/work/iMX6/Yocto/imx6qsabresd_build/tmp/work/imx6qsabresd-poky-linux-gnueabi/fsl-image-qt5/1.0-r0/rootfs/usr/include/ -Wp,-MD,.convert_manager.o.d -c -o convert_manager.o convert_manager.c
In file included from /media/work/iMX6/Yocto/imx6qsabresd_build/tmp/work/imx6qsabresd-poky-linux-gnueabi/fsl-image-qt5/1.0-r0/rootfs/usr/include/features.h:389:0,
from /media/work/iMX6/Yocto/imx6qsabresd_build/tmp/work/imx6qsabresd-poky-linux-gnueabi/fsl-image-qt5/1.0-r0/rootfs/usr/include/stdio.h:27,
from /media/work/iMX6/Yocto/video2lcd_arm/include/config.h:5,
from convert_manager.c:2:
/media/work/iMX6/Yocto/imx6qsabresd_build/tmp/work/imx6qsabresd-poky-linux-gnueabi/fsl-image-qt5/1.0-r0/rootfs/usr/include/gnu/stubs.h:7:29: fatal error: gnu/stubs-soft.h: No such file or directory
# include <gnu/stubs-soft.h>
^
compilation terminated.
make[2]: *** [convert_manager.o] Error 1
make[2]: Leaving directory `/media/work/iMX6/Yocto/video2lcd_arm/convert'
make[1]: *** [convert] Error 2
make[1]: Leaving directory `/media/work/iMX6/Yocto/video2lcd_arm'
make: *** [all] Error 2
~~~
可以看到提示說找不到一些標準的頭文件,其實這個是因為我們沒有添加一些指定的選擇來告訴其使用stubs-hard.h,所以默認的去查找stubs-soft.h。
例如我們編譯一個helloworld,那么可以按照如下編譯:
~~~
$CC hello.c -o hello
~~~
這樣將省去了諸多選項的手動指定,也不會出問題。
- 前言
- (1): Yocto 編譯后文件放在了哪里 輸出文件位置
- (2): Yocto Linux內核編譯目錄在哪?
- (3): Yocto 如何重新編譯Linux內核與dtb,并放到deploy目錄?
- (4): Yocto 如何確定(找到)一個包的名字
- (5): Yocto如何更改source code的下載與git clone地址
- (6): Yocto中如何共享已經下載的文件
- (7): Yocto Bitbake的clean與cleanall以及cleansstate的區別
- (8): Yocto 如何加快軟件包的下載 如何只下載所有需要的軟件包而不編譯
- (9): Yocto 軟件包的下載地址在哪
- (10): Yocto hellworld 添加一個軟件包
- (11): Yocto如何往最終的rootfs中添加軟件
- (12): 使用Yocto幫組我們尋找難找的固件與固件放置路徑
- (13): Yocto 查看軟件包的依賴關系
- (14): Yocto中編譯鏈的配置變更(tuning)
- (15): Yocto中的包管理器
- (16): Yocto 制作SDK分發Toolchain 脫離Yocto環境開發
- (17): Yocto License問題:restricted license not whitelisted in LICENSE_FLAGS_WHITELIST
- (18): Yocto SDK Toolchian中靜態庫的添加
- (19): Yocto SDK Toolchian的使用