導航:首頁 > 源碼編譯 > egl交叉編譯

egl交叉編譯

發布時間:2022-10-02 18:43:23

① 樹莓派 編譯 platform選哪個

1、獲取升級所需源碼

1)下載地址:
官方網址:https://github.com/raspberrypi
上面列出了樹莓派所有的開源軟體:
firmware:樹莓派的交叉編譯好的二進制內核、模塊、庫、bootloader
linux:內核源碼
tools:編譯內核和其他源碼所需的工具——交叉編譯器等
我們只需要以上三個文件即可,下面的工程可以了解一下

documentation:樹莓派離線幫助文檔,教你如何使用、部署樹莓派(樹莓派官方使用教程)
userland:arm端用戶空間的一些應用庫的源碼——vc視頻硬浮點、EGL、mmal、openVG等
hats:Hardware Attached on Top,樹莓派 B+型板子的擴展板資料
maynard:一個gtk寫成的桌面環境
scratch:一個簡易、可視化編程環境
noobs:一個樹莓派鏡像管理工具,他可以讓你在一個樹莓派上部署多個鏡像
weston:一個應用程序
target_fs:樹莓派最小文件系統,使用busybox製作
quake3:雷神之錘3有線開發源碼firmwareb
2)下載方法:
a、網頁直接下載:

點到所需要下載的工程,左上角選版本,右方有一個download ZIP按鈕可直接下載(筆者下載完成後,在linux中解壓提示出錯,windows又非常慢切內核建議不要在windows環境解壓,所以筆者不建議使用這種辦法)

b、使用git下載
$ mkdir raspeberrypi_src
$ cd raspberrypi_src
$ git clone git://github.com/raspberrypi/firmware.git
$ git clone git://github.com/raspberrypi/linux.git
$ git clone git://github.com/raspberrypi/tools.git

會得到三個文件夾
firmware linux tools

2、編譯、提取內核及其模塊

1)獲得內核配置文件
在運行的樹莓派中運行:
$ls /proc/
可看到一個叫config.gz的文件,他是當前的樹莓派配置選項記錄文件,我們將他拷出,放入我們的內核源碼目錄樹下

$cp /proc/config /home/pi
我們這里使用前面交過的samba拷出並拷入內核源碼目錄下,不熟悉的人可參考前面文章

在linux內核源碼下執行:
$zcat config.gz > .config

2)配置、編譯內核
a、修改內核源碼makefile ARCH類型和編譯器路徑
$vi Makefile +195
找到以上類似代碼,改為如圖所示

b、查看、修改配置選項
$make menuconfig
可出現以下界面

如果不做修改,直接選中exit即可(注意使用鍵盤操作)

c、編譯內核鏡像
$make
在arch/arm/boot目錄下可以看到一個叫zImage的文件,就是我們新的內核

但是樹莓派需要另外一種格式的鏡像,需要進行處理一下,執行以下命令
$cd tools/mkimage

$./imagetool-uncompressed.py ../../linux/arch/arm/boot/zImage
即可在當前文件夾下看到一個叫:kernel.img的文件,就是我們需要的新內核了

d、提取moles
上一步其實不但編譯出來了內核的源碼,一些模塊文件也編譯出來了,這里我們提取一下
$cd raspberrypi_src
$mkdir moles
$cd linux
$ make moles_install INSTALL_MOD_PATH=../moles

即可在moles得到我們需要的模塊文件

2、升級RPi的kernel、Firmware、lib
將SD卡拔下插在電腦上(可使用讀卡器)
1)升級內核
將新編好的內核拷入SD卡,改名為:kernel_new.img
打開boot目錄下
找到config.txt文件,加入:kernel=kernel_new.img這一行

2)升級boot
將firmware/boot/目錄下 以下文件拷入SD卡boot目錄:fbootcode.bin fixup.dat fixup_cd.dat start.elf

3)更新vc庫及內核moles
將第3步d步中編譯出來的moles/lib/moles拷入樹莓派文件系統/lib下

② 如何在Windows下構建ARM Linux QT開發環境

在PC上,需要得到兩個版本的Qt,分別是:Qt-4.5.2和QtEmbedded-4.5.2-arm。前者包括了QtDesigner等基本工具,用於在PC上對程序的開發調試,使能確保程序放到板子上之前就符合設計的要求;然後用後者的庫將調試好的程序編譯成能在arm-linux平台上運行的程序。

Qt-4.5.2用從網上下載到的qt-x11-opensource-src-4.5.2.tar.gz編譯後安裝得到;QtEmbedded-4.5.2-arm用qt-embedded-linux-opensource-src-4.5.2.tar.gz編譯後安裝得到,Qt-embedded-linux-opensource-src-4.5.2.tar.gz還可以編譯成QtEmbedded-4.5.2-X86,但不需要。在編譯qt-embedded-linux-opensource-src-4.5.2.tar.gz之前,必須准備好arm-linux-gcc交叉編譯工具,用的是arm-linux-gcc-3.4.1。

所以先要准備好的軟體包有:

Pc的操作系統是:LINUX-ubuntu8.04。

下面是具體編譯安裝過程:

1、Qt-4.5.2的獲得將qt-x11-opensource-src-4.5.2.tar.gz復制到目錄:/home/chh/Project/qt,

2、然後解壓:

#tarzxvfqt-x11-opensource-src-4.5.2.tar.gz

得到一個新目錄:qt-x11-opensource-src-4.5.2

cd進入這個目錄,准備開始編譯。

3、在終端中這樣操作:

#./configure–qvfb//編譯配置,此過程大概歷時幾分鍾;#make//正式編譯,過程漫長,大概2個多小時;#cdtools/qvfb//進入此目錄,准備對它進行編譯#make//編譯,幾分鍾#cd../..//回到qt-x11-opensource-src-4.5.2主目錄,准備安裝#makeinstall//安裝,十幾分鍾吧;

4、此步必須以root身份完成,否則無法建立目錄

5、可以在/usr/local/下看到一個Trolltech目錄,進入該目錄發現Qt-4.5.2目錄已經出現,進入裡面的bin目錄,Designer等工具已經可以使用了。

6、編譯過程相當費時,所以可以直接拷貝已經編譯過的源碼,直接makeinstall。

7、至此,Qt-4.5.2的安裝已經順利完成。

QtEmbedded-4.5.2-arm的獲得

在編譯安裝qt-embedded-linux-opensource-src-4.5.2之前,必須先配置好arm-linux-gcc,將arm-linux-gcc-3.4.1.tar.bz2解壓到目錄:/usr/local下,此時local下出現一個名為arm的目錄,然後配置好環境變數:在/etc/profile添加一句:exportPATH=$PATH:/usr/local/arm/3.4.1/bin,保存後#source/etc/profile一下,讓它即時生效。否則下面的編譯過程會提示找不到arm-linux-gcc命令。現在可以開始編譯了:

將qt-embedded-linux-opensource-src-4.5.2.tar.gz復制到目錄:/home/chh/Project/qt,然後解壓:#tarzxvfqt-embedded-linux-opensource-src.tar.gz,得到新目錄qt-embedded-linux-opensource-src-4.5.2。

進入qt-embedded-linux-opensource-src-4.5.2目錄,首先進行configure。這里的參數很重要,必不可少的是-embeddedarm,所以最簡單的配置信息可以這樣:

./configure-embeddedarm

然後回車,就開始configure了,參數設置和參考文章一樣,裁減了很多,減少了編譯時間:


./configure-release-shared-fast-no-largefile-qt-sql-sqlite-no-qt3support-no-xmlpatterns-no-mmx-no-3dnow-no-sse-no-sse2-no-svg-no-webkit-qt-zlib-qt-gif-qt-libtiff-qt-libpng-qt-libmng-qt-libjpeg-makelibs-xplatformqws/linux-arm-g++-nomaketools-nomakeexamples-nomakedocs-nomakedemo-no-nis-no-cups-no-iconv-no-dbus-no-openssl-embeddedarm-little-endian-qt-freetype-depths16,18-qt-gfx-linuxfb-no-gfx-transformed-no-gfx-multiscreen-no-gfx-vnc-no-gfx-qvfb-qt-kbd-usb-no-glib


之後就可以編譯了,#make,漫長等待後再#makeinstall。Makeinstall還是需要root許可權。

完成後,在/usr/local/Trolltech下多了一個目錄:QtEmbedded-4.5.2-arm。

③ 如何在TI的AM335x上面使用SGX加速的有OpenGL支持的QT

TI官方的指南請看這里,因為發布時間的關系,這裡面已經有很多和最新的軟體包不匹配的地方。經過我的努力,我把這個指南中間復雜的部分給做到Buildroot裡面去了,基本上實現了「傻瓜式」編譯,可通過菜單選擇,簡單地實現QT下使用SGX硬體加速的OpenGL。

由於本文還涉及到了SGX硬體驅動程序模塊的編譯,所以看上去還會比較長,但這部分內容沒有什麼難度。轉載請註明來自EE小站,[email protected]

簡單的梳理下:
前提是U-boot、內核、文件系統都搞利索了,板子能啟動了
TI的Wiki提供了U-boot和內核的說明,地址點這里。
TI的SDK里提供了製作好的文件系統,但是太龐大了,可以下載Buildroot自己做一個。
下載我做的Buildroot補丁,和TI圖形SDK
補丁的地址在這里。
這個補丁是我給Buildroot 2013.05做的,與之相配的TI圖形SDK在這里,下「Graphics_SDK_setuplinux_4_10_00_01_BinOnly.bin」就可以。
應該2013.05之後一段時間Buildroot版本都可以使用這個補丁。
用SDK編譯內核模塊
可以參照TI的指南,地址點這里。也可以直接看本文。
用Buildroot製作根文件系統
具體過程如下:
假設Graphics_SDK_setuplinux_4_10_00_01_BinOnly.bin下載到了/home/c,那麼
~ # cd /home/c
/home/c # chmod 744 ./Graphics_SDK_setuplinux_4_10_00_01_BinOnly.bin
/home/c # ./Graphics_SDK_setuplinux_4_10_00_01_BinOnly.bin
會出來一個交互的安裝界面,安裝的時候選擇「8.x」那項(因為處理器是AM335x),並且把SDK安裝到,例如/home/c/core335x_bsp/graphics_sdk_4_10_00_01
安裝完後,打開/home/c/core335x_bsp/graphics_sdk_4_10_00_01/Rules.make
假設你的ARM交叉編譯器安裝在/usr/local/arm/4.7.3-2,前綴是arm-none-linux-gnueabi-,你的內核在/home/c/core335x_bsp/linux-3.2.21,那麼就Rules.make中的內容修改成這樣
# Set home area (ex /home/user/)
HOME=/home/c/core335x_bsp
# Set Toolchain path (ex /home/user/toolchain/arago-2011.09/armv7a)
CSTOOL_DIR=/usr/local/arm/4.7.3-2
# Set Tool chain prefix (ex arm-arago-linux-gnueabi- )
CSTOOL_PREFIX=arm-none-linux-gnueabi-
# Set kernel installation path ( ex /home/user/linux-04.00.01.13 )
KERNEL_INSTALL_DIR=/home/c/core335x_bsp/linux-3.2.21
# Set Target filesystem path ( ex /home/user/targetfs )
TARGETFS_INSTALL_DIR=$(DESTDIR)
# Set installation folder
GRAPHICS_INSTALL_DIR=$(HOME)/graphics_sdk_4_10_00_01
然後就可以編譯了
/home/c # cd core335x_bsp/graphics_sdk_4_10_00_01
/home/c/core335x_bsp/graphics_sdk_4_10_00_01 # make DESTDIR=/home/c/nfsroot OMAPES=8.x
假設你的根文件系統在/home/c/nfsroot,那麼請確保有/home/c/nfsroot/etc和/home/c/nfsroot/etc/init.d這兩個目錄,否則安裝時候會出錯,接下來安裝
/home/c/core335x_bsp/graphics_sdk_4_10_00_01 # make DESTDIR=/home/c/nfsroot OMAPES=8.x install

這樣,SDK庫就編譯好了,接下來把內核的模塊安裝到文件系統里,假設內核在/home/c/core335x_bsp/linux-3.2.21,已經配置並且編譯好了
/home/c/core335x_bsp/graphics_sdk_4_10_00_01 # cd /home/c/core335x_bsp/linux-3.2.21
/home/c/core335x_bsp/linux-3.2.21 # make ARCH=arm moles_install INSTALL_MOD_PATH=/home/c/nfsroot
然後需要把內核驅動模塊增加到依賴表中,位置在/home/c/nfsroot/lib/moles/3.2.21/kernel/drivers/moles.dep,在裡面增加這兩行:
extra/omaplfb.ko:
extra/pvrsrvkm.ko:
接下來就可以用Buildroot製作文件系統了,假設Buildroot的壓縮包buildroot-2013.05.tar.bz2下載到了/home/c/core335x_bsp,我做的Buildroot補丁buildroot-am335x.patch下載到了/home/c/core335x_bsp
/home/c/core335x_bsp/linux-3.2.21 # cd /home/c/core335x_bsp
/home/c/core335x_bsp # tar xf buildroot-2013.05.tar.bz2
/home/c/core335x_bsp # cp buildroot-am335x.patch buildroot-2013.05
/home/c/core335x_bsp # cd buildroot-2013.05
/home/c/core335x_bsp/buildroot-2013.05 # patch -p1 < buildroot-am335x.patch
/home/c/core335x_bsp/buildroot-2013.05 # make menuconfig
然後就可以進行配置,QT在Package Selection for the target > Graphic libraries and applications (graphic/text) > Qt,AM335x的OpenGL支持設置選項在Qt下的Graphics drivers,必須先選中Linux Framebuffer,會出現AM335x SGX OpenGL Dirver,選中並在下方輸入圖形SDK的路徑,例如/home/c/core335x_bsp/graphics_sdk_4_10_00_01,其他的選項按需選擇即可,接下來就可以編譯

/home/c/core335x_bsp/buildroot-2013.05 # make

編譯過程會自動下載所需的各種軟體包,如果沒有選中Qt下的Approve free license,中間會提示選擇授權類型,編譯完成之後,將映像釋放到根文件系統里
/home/c/core335x_bsp/buildroot-2013.05 # tar xf output/image/rootfs.tar -C /home/c/nfsroot

之後,打開/home/c/nfsroot/etc/init.d/powervr.ini,把這裡面改成
[default]
WindowSystem=libpvrQWSWSEGL.so
將/home/c/nfsroot下的文件系統掛載到目標板上,啟動以後,輸入用戶名root登陸,運行
# /etc/init.d/335x-demo
# mv /etc/init.d/rc.pvr /etc/init.d/S99powervr
至此,這個文件系統就支持QT使用SGX硬體加速的OpenGL了。
如果你在配置QT的時候選擇了Compile and install demos and examples (with code),那麼你可以找到/home/c/core335x_bsp/buildroot-2013.05/output/build/qt-4.8.4/examples/opengl/hellogl_es2/hellogl_es2這個文件,把它拷貝到根文件系統里,運行
# hellogl_es2 -qws -display powervr
可以檢驗是否可以正常工作。
需要說明一下,為了讓QT支持OpenGL,AM335x圖形處理器的廠家(不是TI,是Imagination Technologies)提供的插件程序讓QT的動態鏈接庫禁止滑鼠游標顯示。現象就是,雖然看不到滑鼠,但是還可以用。這個目前還沒有解決方法,因為貌似圖形處理器是直接操作Frame Buffer的,有滑鼠估計程序不好寫,性能也會下降吧。如果你要用滑鼠的話,需要自己寫個顯示滑鼠游標的程序。
轉載,僅供參考,祝你愉快,滿意請採納。

④ am335x能使用19.2M的時鍾做uboot SPL USBETH引導嗎

TI官指南請看發布間關系面已經新軟體包匹配經我努力我指南間復雜部給做Buildroot面基本實現傻瓜式編譯通菜單選擇簡單實現QT使用SGX硬體加速OpenGL

由於本文涉及SGX硬體驅程序模塊編譯所看比較部內容沒難度轉載請註明自EE站[email protected]

簡單梳理:
前提U-boot、內核、文件系統都搞利索板能啟
TIWiki提供U-boot內核說明址點
TISDK提供製作文件系統太龐載Buildroot自做
載我做Buildroot補丁TI圖形SDK
補丁址
補丁我給Buildroot 2013.05做與相配TI圖形SDKGraphics_SDK_setuplinux_4_10_00_01_BinOnly.bin
應該2013.05段間Buildroot版本都使用補丁
用SDK編譯內核模塊
參照TI指南址點直接看本文
用Buildroot製作根文件系統
具體程:
假設Graphics_SDK_setuplinux_4_10_00_01_BinOnly.bin載/home/c
~ # cd /home/c
/home/c # chmod 744 ./Graphics_SDK_setuplinux_4_10_00_01_BinOnly.bin
/home/c # ./Graphics_SDK_setuplinux_4_10_00_01_BinOnly.bin
交互安裝界面安裝候選擇8.x項(處理器AM335x)並且SDK安裝例/home/c/core335x_bsp/graphics_sdk_4_10_00_01
安裝完打/home/c/core335x_bsp/graphics_sdk_4_10_00_01/Rules.make
假設ARM交叉編譯器安裝/usr/local/arm/4.7.3-2前綴arm-none-linux-gnueabi-內核/home/c/core335x_bsp/linux-3.2.21Rules.make內容修改
# Set home area (ex /home/user/)
HOME=/home/c/core335x_bsp
# Set Toolchain path (ex /home/user/toolchain/arago-2011.09/armv7a)
CSTOOL_DIR=/usr/local/arm/4.7.3-2
# Set Tool chain prefix (ex arm-arago-linux-gnueabi- )
CSTOOL_PREFIX=arm-none-linux-gnueabi-
# Set kernel installation path ( ex /home/user/linux-04.00.01.13 )
KERNEL_INSTALL_DIR=/home/c/core335x_bsp/linux-3.2.21
# Set Target filesystem path ( ex /home/user/targetfs )
TARGETFS_INSTALL_DIR=$(DESTDIR)
# Set installation folder
GRAPHICS_INSTALL_DIR=$(HOME)/graphics_sdk_4_10_00_01
編譯
/home/c # cd core335x_bsp/graphics_sdk_4_10_00_01
/home/c/core335x_bsp/graphics_sdk_4_10_00_01 # make DESTDIR=/home/c/nfsroot OMAPES=8.x
假設根文件系統/home/c/nfsroot請確保/home/c/nfsroot/etc/home/c/nfsroot/etc/init.d兩目錄否則安裝候錯接安裝
/home/c/core335x_bsp/graphics_sdk_4_10_00_01 # make DESTDIR=/home/c/nfsroot OMAPES=8.x install

SDK庫編譯接內核模塊安裝文件系統假設內核/home/c/core335x_bsp/linux-3.2.21已經配置並且編譯
/home/c/core335x_bsp/graphics_sdk_4_10_00_01 # cd /home/c/core335x_bsp/linux-3.2.21
/home/c/core335x_bsp/linux-3.2.21 # make ARCH=arm moles_install INSTALL_MOD_PATH=/home/c/nfsroot
需要內核驅模塊增加依賴表位置/home/c/nfsroot/lib/moles/3.2.21/kernel/drivers/moles.dep面增加兩行:
extra/omaplfb.ko:
extra/pvrsrvkm.ko:
接用Buildroot製作文件系統假設Buildroot壓縮包buildroot-2013.05.tar.bz2載/home/c/core335x_bsp我做Buildroot補丁buildroot-am335x.patch載/home/c/core335x_bsp
/home/c/core335x_bsp/linux-3.2.21 # cd /home/c/core335x_bsp
/home/c/core335x_bsp # tar xf buildroot-2013.05.tar.bz2
/home/c/core335x_bsp # cp buildroot-am335x.patch buildroot-2013.05
/home/c/core335x_bsp # cd buildroot-2013.05
/home/c/core335x_bsp/buildroot-2013.05 # patch -p1 < buildroot-am335x.patch
/home/c/core335x_bsp/buildroot-2013.05 # make menuconfig
進行配置QTPackage Selection for the target > Graphic libraries and applications (graphic/text) > QtAM335xOpenGL支持設置選項QtGraphics drivers必須先選Linux Framebuffer現AM335x SGX OpenGL Dirver選並輸入圖形SDK路徑例/home/c/core335x_bsp/graphics_sdk_4_10_00_01其選項按需選擇即接編譯

/home/c/core335x_bsp/buildroot-2013.05 # make

編譯程自載所需各種軟體包沒選QtApprove free license間提示選擇授權類型編譯完映像釋放根文件系統
/home/c/core335x_bsp/buildroot-2013.05 # tar xf output/image/rootfs.tar -C /home/c/nfsroot

打/home/c/nfsroot/etc/init.d/powervr.ini面改
[default]
WindowSystem=libpvrQWSWSEGL.so
/home/c/nfsroot文件系統掛載目標板啟輸入用戶名root登陸運行
# /etc/init.d/335x-demo
# mv /etc/init.d/rc.pvr /etc/init.d/S99powervr
至文件系統支持QT使用SGX硬體加速OpenGL
配置QT候選擇Compile and install demos and examples (with code)找/home/c/core335x_bsp/buildroot-2013.05/output/build/qt-4.8.4/examples/opengl/hellogl_es2/hellogl_es2文件拷貝根文件系統運行
# hellogl_es2 -qws -display powervr
檢驗否工作
需要說明讓QT支持OpenGLAM335x圖形處理器廠家(TIImagination Technologies)提供插件程序讓QT態鏈接庫禁止滑鼠游標顯示現象雖看滑鼠用目前沒解決貌似圖形處理器直接操作Frame Buffer滑鼠估計程序寫性能降吧要用滑鼠需要自寫顯示滑鼠游標程序

⑤ 如何在Windows下構建ARM Linux QT開發環境

准備工作:
首先,最不可思議的,是要在Linux下把QT編譯一遍,因為庫都是一樣的,需要的就是一些Windows下的qmake、moc、uic之類的工具而已。因為QT源碼很多地方不能在Windows下面交叉編譯通過,雖然我改了一些代碼和配置(一會兒我貼出補丁來),但我只用它編譯了qtbase、qtdeclarative這兩個模塊和qttools模塊中的一部分。
Linux下的編譯可以參照我之前寫的這篇文章。參考配置:
開發包:
./configure -extprefix /opt/qt/5.2.1/arm -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
運行庫:
./configure -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
做完這一步,你獲得兩樣東西,sysroot和linux下的ARM QT開發文件。sysroot是編譯QT之前,用Buildroot做的開發用根目錄。這兩個東西都要拷貝到Windows里,因為Windows不支持符號連接,拷貝需要需要去掉這些連接,這么做:
cp [源目錄] [目標目錄] -Lr
第二,需要一個Windows下模擬Linux環境的東西和編譯器,我用的是MSYS和MinGW,因為他們編譯出來的程序比Cygwin快。在這里可以找到:http://www.mingw.org/。
第三,需要Linaro ARM GCC編譯器,Windows版本的。在這里可以找到:http://www.linaro.org/downloads/
第四,需要python,Windows版本的。在這里可以找到:https://www.python.org/downloads/
下載、安裝,然後在MSYS根目錄的/etc/profile裡面export PATH=$PATH:[Python安裝目錄]
第五,需要pkg-config,Windows版本的,這個比較麻煩,需要下載以下三個文件,並提取出我們需要的東西:
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip
(提取pkg-config.exe)
http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib_2.28.8-1_win32.zip
(提取libglib-2.0-0.dll)
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/gettext-runtime_0.18.1.1-2_win32.zip (提取intl.dll)
把他們都放到MSYS的bin目錄下,然後給pkg-config.exe做一個腳本pkg-config,因為下載的pkg-config.exe比較蠢,在同時指定PKG_CONFIG_SYSROOT_DIR和PKG_CONFIG_LIBDIR這兩個環境變數的時候,第一個cflags會輸出兩次PKG_CONFIG_SYSROOT_DIR。這么做這個腳本:
#!/bin/sh
pushd / > /dev/null
ROOTDIR=`pwd -W 2>/dev/null`
popd > /dev/null
SYSROOT=$PKG_CONFIG_SYSROOT_DIR
pkg-config.exe "$@" | sed "s#$SYSROOT$SYSROOT#$SYSROOT#g" | sed "s#$ROOTDIR##g"
最後去掉$ROOTDIR前綴是為了和Linux Makefile兼容,同時也不會影響在make中的地址轉換,最後,QT源碼和我的補丁。
我的補丁如下:
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/configure qt-everywhere-opensource-src-5.2.1/qtbase/configure
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/configure 2014-02-02 04:37:23 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/configure 2014-08-27 22:34:47 +0800
@@ -4022,6 +4022,10 @@
done

(cd "$outpath/qmake"; "$MAKE") || exit 2
+ if [ -e "$outpath/bin/qmake.exe" ]; then
+ echo '#!/bin/sh' > "$outpath/bin/qmake"
+ echo "$outpath/bin/qmake.exe" '"$@"' "-unix" >> "$outpath/bin/qmake"
+ fi
fi # Build qmake

echo "Running configuration tests..."
@@ -4091,9 +4095,9 @@
# when xcompiling, check environment to see if it's actually usable
if [ -z "$PKG_CONFIG_LIBDIR" ]; then
if [ -n "$CFG_SYSROOT" ] && [ -d "$CFG_SYSROOT/usr/lib/pkgconfig" ]; then
- PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig:$CFG_SYSROOT/usr/share/pkgconfig
+ PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig\;$CFG_SYSROOT/usr/share/pkgconfig
if [ -n "$GCC_MACHINE_DUMP" ]; then
- PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
+ PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR\;$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
fi
export PKG_CONFIG_LIBDIR
echo >&2 "Note: PKG_CONFIG_LIBDIR automatically set to $PKG_CONFIG_LIBDIR"
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-02-02 04:37:37 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-08-28 00:08:34 +0800
@@ -11,14 +11,21 @@
include(../common/g++-unix.conf)

# modifications to g++.conf
-QMAKE_CC = arm-linux-gnueabi-gcc
-QMAKE_CXX = arm-linux-gnueabi-g++
-QMAKE_LINK = arm-linux-gnueabi-g++
-QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++
+QMAKE_CC = arm-linux-gnueabihf-gcc
+QMAKE_CXX = arm-linux-gnueabihf-g++
+QMAKE_LINK = arm-linux-gnueabihf-g++
+QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++

# modifications to linux.conf
-QMAKE_AR = arm-linux-gnueabi-ar cqs
-QMAKE_OBJCOPY = arm-linux-gnueabi-obj
-QMAKE_NM = arm-linux-gnueabi-nm -P
-QMAKE_STRIP = arm-linux-gnueabi-strip
+QMAKE_AR = arm-linux-gnueabihf-ar cqs
+QMAKE_OBJCOPY = arm-linux-gnueabihf-obj
+QMAKE_NM = arm-linux-gnueabihf-nm -P
+QMAKE_STRIP = arm-linux-gnueabihf-strip
+
+# support for OpenGL
+QMAKE_LIBS_EGL = -lEGL
+QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM
+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
+#QMAKE_LIBS +=
+
load(qt_config)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp 2014-02-02 04:37:29 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp 2014-08-26 13:53:15 +0800
@@ -1161,8 +1161,8 @@

QString srcf = (*sit).toQString();
QString dstf = (*oit).toQString();
- t << escapeDependencyPath(dstf) << ": " << escapeDependencyPath(srcf)
- << " " << escapeDependencyPaths(findDependencies(srcf)).join(" \\\n\t\t");
+ t << escapeDependencyPath(dstf).replace(QRegExp("\\\\"), "/") << ": " << escapeDependencyPath(srcf).replace(QRegExp("\\\\"), "/")
+ << " " << escapeDependencyPaths(findDependencies(srcf)).replaceInStrings(QRegExp("\\\\"), "/").join(" \\\n\t\t");

ProKey comp, cimp;
for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {
@@ -3346,6 +3346,8 @@
QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst)
{
QString ret;
+ QString src_p = src;
+ QString dst_p = dst;
if (project->isEmpty(replace_rule)
|| project->isActiveConfig("no_sed_meta_install")) {
ret += "-$(INSTALL_FILE) \"" + src + "\" \"" + dst + "\"";
@@ -3362,7 +3364,7 @@
+ "," + windowsifyPath(replace.toQString()) + ",gi");
}
}
- ret += " \"" + src + "\" >\"" + dst + "\"";
+ ret += " \"" + src_p.replace(QRegExp("\\\\"), "/") + "\" >\"" + dst_p.replace(QRegExp("\\\\"), "/") + "\"";
}
return ret;
}

struct TermChain {
TermChain(PatternTerm term)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro 2014-08-28 10:42:55 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private
DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro 2014-08-28 10:46:59 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private

qtHaveMole(qmldevtools-private) {
接下來開始配置:

其中-extprefix定義安裝位置,在編譯完以後可以改,一會兒說;-prefix、-plugindir、-importdir、-qmldir定義的位置是目標板上的位置,加雙斜杠是為了防止MSYS翻譯這些路徑成MSYS的路徑,其他的設定與Linux下的編譯沒有不同。Linux下編譯的sysroot可以拷貝到例如:E:/MinGW/opt/sysroot-arm。
然後編譯
make mole-qtbase
make mole-qtdeclarative
cd qttools/src/linguist
../../../qtbase/bin/qmake.exe -unix linguist.pro
make
編譯的時候可能會有幾個庫有鏈接錯誤,找不到一大堆gl、egl打頭的函數,這是因為相應的Makefile裡面的LIBS沒有自動加上-lEGL -lGLES_CM -lGLESv2;但是正式使用qmake的時候不會,很奇怪;因為也就幾個地方,出問題了手工加一下吧,我沒去查原因改代碼。
編譯linguist的時候可能會遇到這個問題:http://qt-project.org/forums/viewthread/33370,按裡面說的處理。
編譯完了以後,把下列文件拷貝到Linux下編譯的ARM QT開發包的bin目錄中去:

然後,刪掉對應的ARM QT開發包的bin目錄中沒有exe後綴的文件,那些是Linux下的。
最後一步,確保安裝路徑正確,也就是說,如果配置Windows下QT的時候設定-extprefix E:/MinGW/opt/qt/5.2.1/arm,那就要把替換過exe文件的ARM QT開發包放到這個位置,如果路徑改了,可以用二進制搜索工具去qmake.exe中替換這個字串。
補充一下關於調試的問題,其實不是很關鍵。
在使用Debug模式編譯的時候,最後會出現如下提示:
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB. Attempting to continue with the default i386 settings.
這是因為在mkspecs/features/unix/gdb_dwarf_index.prf中,有這樣一段:
QMAKE_GDB_INDEX += \
test \$\$(gdb --version | sed -e \'s,[^0-9][^0-9]*\\([0-9]\\)\\.\\([0-9]\\).*,\\1\\2,;q\') -gt 72 && \
gdb --nx --batch --quiet -ex \'set confirm off\' -ex \"save gdb-index $$QMAKE_GDB_DIR\" -ex quit \'$(TARGET)\' && \
test -f $(TARGET).gdb-index && \
$$QMAKE_OBJCOPY --add-section \'.gdb_index=$(TARGET).gdb-index\' --set-section-flags \'.gdb_index=readonly\' \'$(TARGET)\' \'$(TARGET)\' && \
$$QMAKE_DEL_FILE $(TARGET).gdb-index || true

很顯然,這段代碼把調試用的GDB默認為「gdb」了,所以應該改成你用的gdb,比如arm-linux-gnueabihf-gdb。另外,這里的sed對GDB版本的判斷,無法識別像「GNU gdb (Sourcery CodeBench Lite 2014.05-29) 7.7.50.20140217-cvs」這樣的版本信息的,只能識別像「GNU gdb (GDB) 7.6.1」這樣的版本信息,所以你有可能看不到剛才那段提示。想解決,要麼重新寫一段sed的正則表達式,要麼直接就把這個test ... -gt 72刪掉。

⑥ 如何在Windows下構建ARM Linux QT開發環境

准備工作:
首先,最不可思議的,是要在Linux下把QT編譯一遍,因為庫都是一樣的,需要的就是一些Windows下的qmake、moc、uic之類的工具而已。因為QT源碼很多地方不能在Windows下面交叉編譯通過,雖然我改了一些代碼和配置(一會兒我貼出補丁來),但我只用它編譯了qtbase、qtdeclarative這兩個模塊和qttools模塊中的一部分。
Linux下的編譯可以參照我之前寫的這篇文章。參考配置:
開發包:
./configure -extprefix /opt/qt/5.2.1/arm -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
運行庫:
./configure -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
做完這一步,你獲得兩樣東西,sysroot和linux下的ARM QT開發文件。sysroot是編譯QT之前,用Buildroot做的開發用根目錄。這兩個東西都要拷貝到Windows里,因為Windows不支持符號連接,拷貝需要需要去掉這些連接,這么做:
cp [源目錄] [目標目錄] -Lr
第二,需要一個Windows下模擬Linux環境的東西和編譯器,我用的是MSYS和MinGW,因為他們編譯出來的程序比Cygwin快。在這里可以找到:http://www.mingw.org/。
第三,需要Linaro ARM GCC編譯器,Windows版本的。在這里可以找到:http://www.linaro.org/downloads/
第四,需要Python,Windows版本的。在這里可以找到:https://www.python.org/downloads/
下載、安裝,然後在MSYS根目錄的/etc/profile裡面export PATH=$PATH:[Python安裝目錄]
第五,需要pkg-config,Windows版本的,這個比較麻煩,需要下載以下三個文件,並提取出我們需要的東西:
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip
(提取pkg-config.exe)
http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib_2.28.8-1_win32.zip
(提取libglib-2.0-0.dll)
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/gettext-runtime_0.18.1.1-2_win32.zip (提取intl.dll)
把他們都放到MSYS的bin目錄下,然後給pkg-config.exe做一個腳本pkg-config,因為下載的pkg-config.exe比較蠢,在同時指定PKG_CONFIG_SYSROOT_DIR和PKG_CONFIG_LIBDIR這兩個環境變數的時候,第一個cflags會輸出兩次PKG_CONFIG_SYSROOT_DIR。這么做這個腳本:
#!/bin/sh
pushd / > /dev/null
ROOTDIR=`pwd -W 2>/dev/null`
popd > /dev/null
SYSROOT=$PKG_CONFIG_SYSROOT_DIR
pkg-config.exe "$@" | sed "s#$SYSROOT$SYSROOT#$SYSROOT#g" | sed "s#$ROOTDIR##g"
最後去掉$ROOTDIR前綴是為了和Linux Makefile兼容,同時也不會影響在make中的地址轉換,最後,QT源碼和我的補丁。
我的補丁如下:
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/configure qt-everywhere-opensource-src-5.2.1/qtbase/configure
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/configure 2014-02-02 04:37:23 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/configure 2014-08-27 22:34:47 +0800
@@ -4022,6 +4022,10 @@
done

(cd "$outpath/qmake"; "$MAKE") || exit 2
+ if [ -e "$outpath/bin/qmake.exe" ]; then
+ echo '#!/bin/sh' > "$outpath/bin/qmake"
+ echo "$outpath/bin/qmake.exe" '"$@"' "-unix" >> "$outpath/bin/qmake"
+ fi
fi # Build qmake

echo "Running configuration tests..."
@@ -4091,9 +4095,9 @@
# when xcompiling, check environment to see if it's actually usable
if [ -z "$PKG_CONFIG_LIBDIR" ]; then
if [ -n "$CFG_SYSROOT" ] && [ -d "$CFG_SYSROOT/usr/lib/pkgconfig" ]; then
- PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig:$CFG_SYSROOT/usr/share/pkgconfig
+ PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig\;$CFG_SYSROOT/usr/share/pkgconfig
if [ -n "$GCC_MACHINE_DUMP" ]; then
- PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
+ PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR\;$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
fi
export PKG_CONFIG_LIBDIR
echo >&2 "Note: PKG_CONFIG_LIBDIR automatically set to $PKG_CONFIG_LIBDIR"
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-02-02 04:37:37 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-08-28 00:08:34 +0800
@@ -11,14 +11,21 @@
include(../common/g++-unix.conf)

# modifications to g++.conf
-QMAKE_CC = arm-linux-gnueabi-gcc
-QMAKE_CXX = arm-linux-gnueabi-g++
-QMAKE_LINK = arm-linux-gnueabi-g++
-QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++
+QMAKE_CC = arm-linux-gnueabihf-gcc
+QMAKE_CXX = arm-linux-gnueabihf-g++
+QMAKE_LINK = arm-linux-gnueabihf-g++
+QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++

# modifications to linux.conf
-QMAKE_AR = arm-linux-gnueabi-ar cqs
-QMAKE_OBJCOPY = arm-linux-gnueabi-obj
-QMAKE_NM = arm-linux-gnueabi-nm -P
-QMAKE_STRIP = arm-linux-gnueabi-strip
+QMAKE_AR = arm-linux-gnueabihf-ar cqs
+QMAKE_OBJCOPY = arm-linux-gnueabihf-obj
+QMAKE_NM = arm-linux-gnueabihf-nm -P
+QMAKE_STRIP = arm-linux-gnueabihf-strip
+
+# support for OpenGL
+QMAKE_LIBS_EGL = -lEGL
+QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM
+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
+#QMAKE_LIBS +=
+
load(qt_config)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp 2014-02-02 04:37:29 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp 2014-08-26 13:53:15 +0800
@@ -1161,8 +1161,8 @@

QString srcf = (*sit).toQString();
QString dstf = (*oit).toQString();
- t << escapeDependencyPath(dstf) << ": " << escapeDependencyPath(srcf)
- << " " << escapeDependencyPaths(findDependencies(srcf)).join(" \\\n\t\t");
+ t << escapeDependencyPath(dstf).replace(QRegExp("\\\\"), "/") << ": " << escapeDependencyPath(srcf).replace(QRegExp("\\\\"), "/")
+ << " " << escapeDependencyPaths(findDependencies(srcf)).replaceInStrings(QRegExp("\\\\"), "/").join(" \\\n\t\t");

ProKey comp, cimp;
for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {
@@ -3346,6 +3346,8 @@
QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst)
{
QString ret;
+ QString src_p = src;
+ QString dst_p = dst;
if (project->isEmpty(replace_rule)
|| project->isActiveConfig("no_sed_meta_install")) {
ret += "-$(INSTALL_FILE) \"" + src + "\" \"" + dst + "\"";
@@ -3362,7 +3364,7 @@
+ "," + windowsifyPath(replace.toQString()) + ",gi");
}
}
- ret += " \"" + src + "\" >\"" + dst + "\"";
+ ret += " \"" + src_p.replace(QRegExp("\\\\"), "/") + "\" >\"" + dst_p.replace(QRegExp("\\\\"), "/") + "\"";
}
return ret;
}

struct TermChain {
TermChain(PatternTerm term)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro 2014-08-28 10:42:55 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private
DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro 2014-08-28 10:46:59 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private

qtHaveMole(qmldevtools-private) {
接下來開始配置:

其中-extprefix定義安裝位置,在編譯完以後可以改,一會兒說;-prefix、-plugindir、-importdir、-qmldir定義的位置是目標板上的位置,加雙斜杠是為了防止MSYS翻譯這些路徑成MSYS的路徑,其他的設定與Linux下的編譯沒有不同。Linux下編譯的sysroot可以拷貝到例如:E:/MinGW/opt/sysroot-arm。
然後編譯
make mole-qtbase
make mole-qtdeclarative
cd qttools/src/linguist
../../../qtbase/bin/qmake.exe -unix linguist.pro
make
編譯的時候可能會有幾個庫有鏈接錯誤,找不到一大堆gl、egl打頭的函數,這是因為相應的Makefile裡面的LIBS沒有自動加上-lEGL -lGLES_CM -lGLESv2;但是正式使用qmake的時候不會,很奇怪;因為也就幾個地方,出問題了手工加一下吧,我沒去查原因改代碼。
編譯linguist的時候可能會遇到這個問題:http://qt-project.org/forums/viewthread/33370,按裡面說的處理。
編譯完了以後,把下列文件拷貝到Linux下編譯的ARM QT開發包的bin目錄中去:

然後,刪掉對應的ARM QT開發包的bin目錄中沒有exe後綴的文件,那些是Linux下的。
最後一步,確保安裝路徑正確,也就是說,如果配置Windows下QT的時候設定-extprefix E:/MinGW/opt/qt/5.2.1/arm,那就要把替換過exe文件的ARM QT開發包放到這個位置,如果路徑改了,可以用二進制搜索工具去qmake.exe中替換這個字串。
補充一下關於調試的問題,其實不是很關鍵。
在使用Debug模式編譯的時候,最後會出現如下提示:
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB. Attempting to continue with the default i386 settings.
這是因為在mkspecs/features/unix/gdb_dwarf_index.prf中,有這樣一段:
QMAKE_GDB_INDEX += \
test \$\$(gdb --version | sed -e \'s,[^0-9][^0-9]*\\([0-9]\\)\\.\\([0-9]\\).*,\\1\\2,;q\') -gt 72 && \
gdb --nx --batch --quiet -ex \'set confirm off\' -ex \"save gdb-index $$QMAKE_GDB_DIR\" -ex quit \'$(TARGET)\' && \
test -f $(TARGET).gdb-index && \
$$QMAKE_OBJCOPY --add-section \'.gdb_index=$(TARGET).gdb-index\' --set-section-flags \'.gdb_index=readonly\' \'$(TARGET)\' \'$(TARGET)\' && \
$$QMAKE_DEL_FILE $(TARGET).gdb-index || true

很顯然,這段代碼把調試用的GDB默認為「gdb」了,所以應該改成你用的gdb,比如arm-linux-gnueabihf-gdb。另外,這里的sed對GDB版本的判斷,無法識別像「GNU gdb (Sourcery CodeBench Lite 2014.05-29) 7.7.50.20140217-cvs」這樣的版本信息的,只能識別像「GNU gdb (GDB) 7.6.1」這樣的版本信息,所以你有可能看不到剛才那段提示。想解決,要麼重新寫一段sed的正則表達式,要麼直接就把這個test ... -gt 72刪掉。

⑦ x86 平台編譯的二進制包是否都不能運行在樹莓派中

firmware:樹莓派的交叉編譯好的二進制內核、模塊、庫、bootloader
linux:內核源碼
tools:編譯內核和其他源碼所需的工具——交叉編譯器等
我們只需要以上三個文件即可,下面的工程可以了解一下

documentation:樹莓派離線幫助文檔,教你如何使用、部署樹莓派(樹莓派官方使用教程)
userland:arm端用戶空間的一些應用庫的源碼——vc視頻硬浮點、EGL、mmal、openVG等
hats:Hardware Attached on Top,樹莓派 B+型板子的擴展板資料
maynard:一個gtk寫成的桌面環境
scratch:一個簡易、可視化編程環境
noobs:一個樹莓派鏡像管理工具,他可以讓你在一個樹莓派上部署多個鏡像
weston:一個應用程序
target_fs:樹莓派最小文件系統,使用busybox製作
quake3:雷神之錘3有線開發源碼firmwareb
2)下載方法:
a、網頁直接下載:

點到所需要下載的工程,左上角選版本,右方有一個download ZIP按鈕可直接下載(筆者下載完成後,在linux中解壓提示出錯,windows又非常慢切內核建議不要在windows環境解壓,所以筆者不建議使用這種辦法)

b、使用git下載
$ mkdir raspeberrypi_src
$ cd raspberrypi_src
$ git clone git://github.com/raspberrypi/firmware.git
$ git clone git://github.com/raspberrypi/linux.git
$ git clone git://github.com/raspberrypi/tools.git

會得到三個文件夾:
firmware linux tools

2、編譯、提取內核及其模塊

1)獲得內核配置文件
在運行的樹莓派中運行:
$ls /proc/
可看到一個叫config.gz的文件,他是當前的樹莓派配置選項記錄文件,我們將他拷出,放入我們的內核源碼目錄樹下

$cp /proc/config /home/pi
我們這里使用前面交過的samba拷出並拷入內核源碼目錄下,不熟悉的人可參考前面文章

在linux內核源碼下執行:
$zcat config.gz > .config

2)配置、編譯內核
a、修改內核源碼makefile ARCH類型和編譯器路徑
$vi Makefile +195
找到以上類似代碼,改為如圖所示

b、查看、修改配置選項
$make menuconfig
可出現以下界面

如果不做修改,直接選中exit即可(注意使用鍵盤操作)

c、編譯內核鏡像
$make
在arch/arm/boot目錄下可以看到一個叫zImage的文件,就是我們新的內核

但是樹莓派需要另外一種格式的鏡像,需要進行處理一下,執行以下命令
$cd tools/mkimage

$./imagetool-uncompressed.py ../../linux/arch/arm/boot/zImage
即可在當前文件夾下看到一個叫:kernel.img的文件,就是我們需要的新內核了

d、提取moles
上一步其實不但編譯出來了內核的源碼,一些模塊文件也編譯出來了,這里我們提取一下
$cd raspberrypi_src
$mkdir moles
$cd linux
$ make moles_install INSTALL_MOD_PATH=../moles

即可在moles得到我們需要的模塊文件

2、升級RPi的kernel、Firmware、lib
將SD卡拔下插在電腦上(可使用讀卡器)
1)升級內核
將新編好的內核拷入SD卡,改名為:kernel_new.img
打開boot目錄下
找到config.txt文件,加入:kernel=kernel_new.img這一行

2)升級boot
將firmware/boot/目錄下 以下文件拷入SD卡boot目錄:fbootcode.bin fixup.dat fixup_cd.dat start.elf

3)更新vc庫及內核moles
將第3步d步中編譯出來的moles/lib/moles拷入樹莓派文件系統/lib下

閱讀全文

與egl交叉編譯相關的資料

熱點內容
男人你都懂的網址tv 瀏覽:258
常平電影院今日電影 瀏覽:673
看上老闆秘書.韓國電影 瀏覽:866
日本島國電影網址 瀏覽:193
如何使單片機的燈依次閃亮交替 瀏覽:430
溫州程序員兼職需要什麼技術 瀏覽:840
功夫那個我不怕表情包 瀏覽:522
熙和宇電影 瀏覽:794
女程序員應該奮斗還是求穩定 瀏覽:391
優傲機器人示教編程 瀏覽:902
口袋閱讀要用什麼app 瀏覽:434
鎖屏控制音樂android 瀏覽:977
手紙解壓陀螺咋玩 瀏覽:149
有一部電影男主是鴨子 瀏覽:816
在哪個網站能看到未刪減電影 瀏覽:591
什麼是appkey 瀏覽:862
男主角是國安局的小說 瀏覽:678
注冊表內文件夾怎麼打開 瀏覽:190
免費看片網站無廣告啊好痛 瀏覽:867
小說重逢孩子女程序員 瀏覽:135