armlinuxqt
Ⅰ 在ARM開發板的嵌入式linux系統上運行的QT程序,必須得要在linux里用QT編嗎
嵌入式中最重要的應用就是linux,linux就是用C語言實現的,你要是懂linuxc的話,那麼做嵌入式這行業門檻肯定是沒有問題了。QT只是其中的一個小小部分,很多時候在嵌入式的工作中是不需要的,因為有很多的嵌入式產品沒有GUI,只用命令行就可以實現了。而且現在做GUI的工具也很多,QT只是其中一種。我的意見是,向linux內核方向發展,這可以最大利用你的既有優勢。
Ⅱ 如何在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刪掉。
Ⅲ 在ARM開發板的嵌入式linux系統上運行的QT程序,必須得要在linux里用QT編嗎
1、想在板子上運行用QT編好的程序,必須要在PC的linux系統里用QT編嗎?
不需要.但是必須經過交叉編譯. (window 無法進行交叉編譯.)
2、在windows系統里編好的QT程序,經過交叉編譯後能直接運行在板子上嗎?還是板子需要弄個QT環境啥的?就是往裡面安個相同版本的QT?
必須要保證板子里已經移植成功QTE.編譯過的程序才可以跑在板子上.
(關於如何移植QTE是個大問題.如果你是新手.one month,good luck to you) 交叉編譯的時候用的是QTE的庫而不是普通的QT庫.而且這個庫的版本和編譯工具鏈必須和板子上的一致.
Ⅳ arm嵌入式linux qt入門問題請教
1、qt-x11是建立在X11圖開庫上的,X11圖形庫又是建軍在FRAMBUFFER上的,FRAMBUFFER是linux內核的圖形庫,X11系統資源需求大,不能用於嵌入式,所以qt-embedded產生了,它不是建立在X11圖形庫上的,它是直接建立在FRAMBUFFER上的,占系統資源極少,可以在嵌入式上使用。qtopia-core這個概念是相對於qtopia提出的。它就是qt-embedded。而qtopia是QT公司的一個嵌入式桌面系統,目前已停止開發了。
2、如果arm上沒有qt庫,不能運行QT程序,必須把相應的QT庫按裝到ARM板上。
3、qmake產生makefile,make根據makefile調用gcc進行編譯。
4、qt-embedded-linux-opensource-src-4.4.3.tar.gz是用在嵌入式上的QT開發庫。用法與qt-4.4.3-x11版的用法一樣。
5、沒有辦法模擬,只能先進行qt-embedded的移植工作。但是開發qt-embedded程序時,到是可以在PC機上先用qvfb模擬調試的。
6、qt-embedded庫先交叉編譯,完成後下載到開發板上,以後開發應用程序時,qt庫不用再下載的。
7、寫qt程序需要4.0版以上的交叉編譯器。網上可以下載現成。
8、這是三個不同版本的gcc交叉編譯器,都老了。目前至少應該使用gcc 4.0以上的。
9、肯定是不行的。
10、呵呵,我也是從新手過來的。也問過類似的小白問題。
Ⅳ 如何編譯ARM版本LINUX QT4.5
編譯安裝內核 下載並解壓內核 解壓內核:tar xf linux-2.6.XX.tar.xz 定製內核:make menuconfig 參見makefile menuconfig過程講解 編譯內核和模塊:make 生成內核模塊和vmlinuz,initrd.img,Symtem.map文件 安裝內核和模塊:sudo make moles_install install 復制模塊文件到/lib/moles目錄下、復制config,vmlinuz,initrd.img,Symtem.map文件到/boot目錄、更新grub 其他命令: make mrprobe:命令的作用是在每次配置並重新編譯內核前需要先執行「make mrproper」命令清理源代碼樹,包括過去曾經配置的內核配置文件「.config」都將被清除。即進行新的編譯工作時將原來老的配置文件給刪除到,以免影響新的內核編譯。 make dep:生成內核功能間的依賴關系,為編譯內核做好准備。 幾個重要的Linux內核文件介紹 config 使用make menuconfig 生成的內核配置文件,決定將內核的各個功能系統編譯進內核還是編譯為模塊還是不編譯。 vmlinuz 和 vmlinux vmlinuz是可引導的、壓縮的內核,「vm」代表「Virtual Memory」。Linux 支持虛擬內存,不像老的操作系統比如DOS有640KB內存的限制,Linux能夠使用硬碟空間作為虛擬內存,因此得名「vm」。
Ⅵ 在Linux下用QT編寫的程序怎麼在ARM上運行
首先,你需要一塊ARM晶元的測試主板。
然後在主板上載入Linux系統,並且在Linux系統中配置QT的演示環境。
然後通過數據線將你編寫好的QT程序傳輸到主板上,然後在PC端使用Telnet或者在主板上進行程序的運行就好了!