當前位置:首頁 » 編程軟體 » cups23交叉編譯

cups23交叉編譯

發布時間: 2022-07-05 09:27:16

1. 如何安裝arm-linux-gcc

這是readme文件
1.arm-gcc-4.4.1-20100409.tar.gz
交叉編譯器,將其解壓
tar zxvf arm-gcc-4.4.1-20100409.tar.gz
到當前目錄
當前目錄將出現usr/local/arm/4.4.1的目錄,將其中的arm目錄拷貝到
/usr/local/arm目錄
在/etc/profile下增加
export PATH=$PATH:/usr/local/arm/4.4.1/bin
然後
source /etc/profile

這樣交叉編譯器安裝成功

2.qtopia-core-opensource-src-4.2.2.tar.gz
qt交叉編譯庫

壓縮
拷貝 qmake.conf 到 mkspecs/qws/linux-arm-g++目錄
替換原有文件
./configure -embedded arm -DQT_QLOCALE_USES_FCVT \
-qt-mouse-pc -qt-freetype -no-cups -no-nis -no-iconv \
-no-qdbus -qt-libjpeg -qt-libpng -qt-gif -qt-zlib \
-no-rpath -no-qt3support -no-largefile -no-accessibility \
-no-stl -no-libmng -little-endian -prefix /opt/QtPalmtop

提示第一次輸入yes 回車
第二次直接回車

sudo make; sudo make install
這樣將qt交叉編譯庫安裝到/opt/QtPalmtop下

增加/opt/QtPalmtop到nfs共享
開發板上將該共享目錄mnt到/opt/QtPalmtop下

在開發板上修改/etc/profile,增加三行
export LD_LIBRARY_PATH=/opt/QtPalmtop/lib
export QWS_DISPLAY="LinuxFb:/dev/fb1"
export QWS_SIZE="800*480"

利用其交叉編譯qt程序
/opt/QtPalmtop/bin/qmake -project
/opt/QtPalmtop/bin/qmake
make
將其qt程序目錄通過nfs共享到開發板,在開發板上運行

在開發板/etc/init.d/rcS文件增加運行的程序:
mount pc機器相關目錄
運行程序
cd /sdcard/project_stu && ./project_stu -qws -nomouse &
cd /sdcard && ./mplayer -x 540 -y 350 (某一個開發板上的視頻文件名)

2. pos機出現cups:55是什麼意思

史上最全POS機錯誤碼、POS應答碼、POS高危碼大全! 交易返回POS終端時都有39 域,POS終端和終端操作員根據應答碼採取相應的操作,可以把操作分為以下幾類:
A : 交易成功
B : 交易失敗,可重試
C : 交易失敗,不需要重試
D : 交易失敗, 終端操作員處理
E : 交易失敗,系統故障,不需要重試
注 1:如 39 域的內容不能在下表中找到,就顯示「交易失敗」
注 2:如POS交易的批次號和網路中心批次號不一致時應答碼會填 「77」,此時POS機應當提示操作員重新簽到後再交易
【POS機錯誤代碼、POS應答碼大全】
代碼 意義 類別 原因/採取的措施 POS顯示的內容
0 承兌或交易成功 A 承兌或交易成功 交易成功
1 查發卡行 C 查發卡行 交易失敗,請聯系發卡行
2 查發卡行的特殊條件 C 可電話向發卡行查詢 交易失敗,請聯系發卡行
3 無效商戶 C 商戶需要在銀行或中心登記 商戶未登記
4 沒收卡 D 操作員沒收卡 沒收卡,請聯系收單行
5 不予承兌 C 發卡不予承兌 交易失敗,請聯系發卡行
6 出錯 E 發卡行故障 交易失敗,請聯系發卡行
7 特殊條件下沒收卡 D 特殊條件下沒收卡 沒收卡,請聯系收單行
9 請求正在處理中 B 重新提交交易請求 交易失敗,請重試
12 無效交易 C 發卡行不支持的交易 交易失敗,請重試
13 無效金額 B 金額為0 或太大 交易金額超限,請重試
14 無效卡號 B 卡種未在中心登記或讀卡號有誤 無效卡號,請聯系發卡行
15 無此發卡行 C 此發卡行未與中心開通業務 此卡不能受理
19 重新送入交易 C 刷卡讀取數據有誤,可重新刷卡 交易失敗,請聯系發卡行
20 無效應答 C 無效應答 交易失敗,請聯系發卡行
21 不做任何處理 C 不做任何處理 交易失敗,請聯系發卡行
22 懷疑操作有誤 C POS狀態與中心不符,可重新簽到 操作有誤,請重試
23 不可接受的交易費 C 不可接受的交易費 交易失敗,請聯系發卡行
25 未能找到文件上記錄 C 發卡行未能找到有關記錄 交易失敗,請聯系發卡行
30 格式錯誤 C 格式錯誤 交易失敗,請重試
31 銀聯不支持的銀行 C 此發卡方未與中心開通業務 此卡不能受理
33 過期的卡 D 過期的卡,操作員可以沒收 過期卡,請聯系發卡行
34 有作弊嫌疑 D 有作弊嫌疑的卡,操作員可以沒收 沒收卡,請聯系收單行
35 受卡方與安全保密部門聯系 D 有作弊嫌疑的卡,操作員可以沒收 沒收卡,請聯系收單行
36 受限制的卡 D 有作弊嫌疑的卡,操作員可以沒收 此卡有誤,請換卡重試
37 受卡方呼受理方安全保密部門(沒收卡) D 有作弊嫌疑的卡,操作員可以沒收 沒收卡,請聯系收單行
38 超過允許的PIN試輸入 D 密碼錯次數超限,操作員可以沒收 密碼錯誤次數超限
39 無此信用卡帳戶 C 可能刷卡操作有誤 交易失敗,請聯系發卡行
40 請求的功能尚不支持 C 發卡行不支持的交易類型 交易失敗,請聯系發卡行
41 丟失卡 D 掛失的卡, 操作員可以沒收 沒收卡,請聯系收單行
42 無此帳戶 B 發卡行找不到此帳戶 交易失敗,請聯系發卡方
43 被竊卡 D 被竊卡, 操作員可以沒收 沒收卡,請聯系收單行
44 無此投資帳戶 C 可能刷卡操作有誤 交易失敗,請聯系發卡行
51 無足夠的存款 C 帳戶內余額不足 余額不足,請查詢
52 無此支票賬戶 C 無此支票賬戶 交易失敗,請聯系發卡行
53 無此儲蓄卡賬戶 C 無此儲蓄卡賬戶 交易失敗,請聯系發卡行
54 過期的卡 C 過期的卡 過期卡,請聯系發卡行
55 不正確的PIN C 密碼輸錯 密碼錯,請重試
56 無此卡記錄 C 發卡行找不到此帳戶 交易失敗,請聯系發卡行
57 不允許持卡人進行的交易 C 不允許持卡人進行的交易 交易失敗,請聯系發卡行
58 不允許終端進行的交易 C 該商戶不允許進行的交易 終端無效,請聯系收單行或銀聯
59 有作弊嫌疑 C 交易失敗,請聯系發卡行
60 受卡方與安全保密部門聯系 C 交易失敗,請聯系發卡行
61 超出取款金額限制 C 一次交易的金額太大 金額太大
62 受限制的卡 C 交易失敗,請聯系發卡行
63 違反安全保密規定 C 違反安全保密規定 交易失敗,請聯系發卡行
64 原始金額不正確 C 原始金額不正確 交易失敗,請聯系發卡行
65 超出取款次數限制 C 超出取款次數限制 超出取款次數限制
66 受卡方呼受理方安全保密部門 C 受卡方呼受理方安全保密部門 交易失敗,請聯系收單行或銀聯
67 捕捉(沒收卡) C 捕捉(沒收卡) 沒收卡
68 收到的回答太遲 C 發卡行規定時間內沒有回答 交易超時,請重試
75 允許的輸入PIN次數超限 C 允許的輸入PIN次數超限 密碼錯誤次數超限
77 需要向網路中心簽到 D POS批次與網路中心不一致 請向網路中心簽到
79 離線交易對帳不平 C POS終端上傳的離線數據對帳不平 POS終端重傳離線數據
90 日期切換正在處理 C 日期切換正在處理 交易失敗,請稍後重試
91 發卡行或銀聯不能操作 C 電話查詢發卡方或銀聯,可重作 交易失敗,請稍後重試
92 金融機構或中間網路設施找不到或無法達到 C 電話查詢發卡方或網路中心,可重作 交易失敗,請稍後重試
93 交易違法、不能完成 C 交易違法、不能完成 交易失敗,請聯系發卡行
94 重復交易 C 查詢網路中心,可重新簽到作交易 交易失敗,請稍後重試
95 調節控制錯 C 調節控制錯 交易失敗,請稍後重試
96 系統異常、失效 C 發卡方或網路中心出現故障 交易失敗,請稍後重試
97 POS終端號找不到 D 終端未在中心或銀行登記 終端未登記,請聯系收單行或銀聯
98 銀聯收不到發卡行應答 E 銀聯收不到發卡行應答 交易超時,請重試
99 PIN格式錯 B 可重新簽到作交易 校驗錯,請重新簽到
A0 MAC校驗錯 B 可重新簽到作交易 校驗錯,請重新簽到

3. 在編譯QT4.8.2出現 {standard input}:1025: Error: no such instruction: `swpb %cl,%al,[%edi]'

我之前在linux下編譯QT 遇到過類似的錯誤 編譯器配置錯誤的問題
修改/root/.bash_profile,把qmake路徑改為*/mkspec/qws/arm-linux-g++

4. 交易渠道cups是什麼意思

CUPS,全稱是CHINA UNIONPAY SYSTEM,中文是「中國銀聯支付清算系統」。

在微信和支付寶等第三方支付尚未成為趨勢之前,大部分人在取款、轉賬、付款時,會經常接觸到ATM機、POS機等,這些都是基於CUPS系統實現的。

銀聯清算系統基本工作流程如下:

一、聯機交易處理流程

  • 收單行交易系統將消費報文發送CUPS,CUPS將指令換發至發卡行。

  • 發卡行檢查用戶結算賬戶頭寸(即借記卡賬戶余額或信用卡可用信用額度),進行賬戶扣款,完成持卡人結算賬戶實時結算動作,並將回復報文發送至CUSP。

  • CUPS更新交易數據,並將回復報文同步收單行的收單系統。

二、銀聯清算系統清分和資金劃撥

  • T日23:00時,CUPS系統日切,並將當天聯機交易日誌同步給清算系統。

  • T+1日凌晨時,清算系統開始進行跨行清算和收單清算。

  • T+1日10:00時,清算系統將匯總後的清分結果,即:各機構清算賬戶、直聯商戶結算賬戶的應收(貸記)應付(借記)金額,發送至各機構進行確認。

  • 各機構對清分結果對賬確認後,通知銀聯清算系統確認交易明細無誤。

  • 清算系統開始進行資金劃撥,通過資金管理平台和支付前置系統按序將支付指令發送至CNAPS,先借記後貸記。

  • 通過大額支付系統借記各機構在央行的備付金清算賬戶。

  • 通過小額支付系統貸記直連商戶在銀行開立的結算賬戶。

  • 通過大額支付系統貸記各機構在人行的備付金清算賬戶。

三、銀行收單結算及內部核算

    資金清算完畢後,銀行會收到央行支付系統報文,此時各機構銀行獲取其在央行備付金系統中各自的賬戶余額並與內部映射的虛擬賬戶余額進行對賬,對賬完畢後更新各自核算系統中「上存央行備付金賬戶」余額,並完成手續費的核算。對於間聯商戶的收單行,還需完成商戶結算賬戶的核算和資金劃撥。

5. Qt 軟體中怎麼自動加入build版本號

當進入解壓好的源碼包後,使用./configure –help命令,可以獲得相應幫助,那我們只要選取參數部分看看 -release 這個參數顯而易見,就是編譯Qt以發布版的模式進行,一般來說,最後系統完成後,庫就應該是發布版。 -release 與上面對應,自然是調試版了,如果開發的話,可以選擇它吧。 -debug-and-release 囧,上面那兩個的兒子。 -developer-build 囧,我錯了,開發者也可以用這個的,選了這個後,可以進行自動測試,不過還沒去用過,以後可以研究研究。 -opensource -commercial 這兩個參數是指是編譯是商業版本的,還是開源版本呢,視個人情況而定。 -shared -static 這兩個參數是指Qt的lib以動態還是靜態編譯生成,這自然也是視個人需要的。 -no-fast -fast 這兩個就很有關系,如果對自己的電腦性能很有信心,那就選第一個,那所有的工程文件都會生成到makefiles中,那編譯的時間,估計可以看完變形金剛了。如果選第二個,那就加入子目錄和庫到makefiles,這樣就能加快編譯的速度。 -no-largefile -largefile 顧名思義,支不支持大文件,一般來說,嵌入式里是不會有從超過4G的大文件的,那就選第一個吧。 -no-exceptions -exceptions 計算機英語夠好的人都該懂,這個自然就是異常情況,選則編譯器支持拋出異常,否則不支持。 -no-accessibility -accessibility 可訪問性的支持,說實話,這個我真不知道有什麼有用了。等哪天發現了,再來好好解釋。 -no-stl -stl 是都加入stl的支持,stl,這應該算是C++程序員應該都了解了,再不濟,那也總聽說過大名吧。 no-sql-<driver> -qt-sql-<driver> -plugin-sql-<driver> 這 個可要好好說明下,一般來說,對於一個優秀的項目開發,資料庫是必不可少的,qt也自帶了大多數資料庫驅動,可以完美地支持資料庫的使用。對於數 據庫的使用,我們可以直接qt驅動編譯進去,或者以插件的形式編譯進去。一般來說,最簡單地就是直接編譯進去,但使用插件形式的可以更加靈活,針對不同的 需求將驅動插件添加。其中,<>代表的是驅動名,如果我想直接添加sqlite的支持話,形式如下:-qt-sql-sqlite。其他名稱 可以自己查看參數里,有詳細地介紹。 -system-sqlite sqlite真受歡迎啊,當然那麼優秀的嵌入式資料庫,本人也是基本使用它來進行開發。這個參數意思是使用操作系統上的sqlite資料庫,如果是不太會移植的,可以考慮直接使用qt自帶的驅動。 -no-qt3support -qt3support 這個也是簡潔易懂,加不加對qt3的支持。 no-xmlpatterns -xmlpatterns 選擇對xml的支持,如果對網路無需求的話,就不用加了。 -no-phonon -phonon phonon是qt中處理多媒體的模塊,比如放放視頻什麼來著,不過本人從沒用過,也是根據需要選擇的。 -no-phonon-backend -phonon-backend 與上面類似,只不過這兩是以插件的形式加入支持。 -no-svg -svg 是否加入svg的支持,svg即可縮放矢量圖形。 -no-webkit -webkit 是否加入webkit的支持,這可是個好東西,不過如果跟網路不搭界的話,還是不支持吧。 -no-scripttools -scripttools 是否加入腳本工具的支持,這對php等腳本工程師來說是個很棒的參數,但對於我這樣菜鳥,就別提了。 -platform target 目標平台,這可是關鍵了,如果不注意的話,編譯出來是x86上的話,哪怕是再牛的嵌入式工程師來也沒法幫你移植到開發板上。通常,本人是linux-arm-g++。 -no-mmx -no-3dnow -no-sse -no-sse2 這四個參數是針對CPU的指令集,老實說,我也不甚了解,不過,對於開發並不是影響很大。 -qtnamespace 把qt的庫封裝到命名空間,沒啥重要用處,依個人愛好加吧。 -qtlibinfix 將所有的qt的.so庫重命名,也沒啥大用處。 -no-sql-<driver> -qt-sql-<driver> -plugin-sql-<driver> -system-sqlite 這是相當明顯的,如果這都看不出來,,囧,那您一定比我近視(本人800度近視。。) 就 是說如果是-no-XX-,就說明編譯時不選擇這個參數,如過是-qt-XX-,說明我們可以編譯直接選用qt自帶的驅動,如果是 -plugin-XX-,就是將驅動以插件形式編譯,而-system-XXX,當然是使用操作系統提供的驅動,不過那就需要您自己移植了,而且有時還要 用第三方的API,就方便來說非常麻煩,但是不排除您是牛人要好好玩玩的情況。 接下來,我們接著研究配置參數。 -qt-zlib -system-zlib 想 必經過上面的講解,參數的意思已經很快得知,就是選擇qt帶的zlib庫還是系統的zlib。zlib庫是用於文件和資料壓縮的庫,對於新入嵌入式的人來 說,可能並無太大的用處,但是在以後的實際開發中,特別是對於多媒體圖像圖形的工程師來說,就肯定用到,因為圖形圖像的壓縮都要使用或涉及到這個庫。 -no-gif -qt-gif 這是選擇gif的支持,如果選擇qt支持的話,那在用qt開發的項目中,就能顯示gif圖,gif也是比較普遍的圖片格式了,英文全稱是Graphics Interchange Format。 -no-libtiff -qt-libtiff -system-libtiff tiff是一種非常復雜的光柵圖像格式,並且有直接現成的C語言實現庫,因此選擇參數時就有了qt和system,一般來說,科學相關的開發里可能會用到。 -no-libpng -qt-libpng -system-libpng png的相關參數,一種非失真性壓縮點陣圖圖形文件格式,其實就是為了替代gif搞出來的,也是隨實際需要來選擇,當然,也有C語言實現的庫。 -no-libmng -qt-libmng -system-libmng 大汗,大汗,這可是超級罕見的東西,QT竟然也能支持,說實話,這個參數我看來就是無視的。MNG是多幀PNG動畫格式,結構極其復雜,基本沒人用。 -no-libjpeg -qt-libjpeg -system-libjpeg jpeg,這么有名的圖片格式也不用說了,隨需要選擇吧。 -no-openssl -openssl -openssl-linked SSL,Security Socket Layer,是一個安全傳輸協議,在Internet網上進行數據保護和身份確認,而OpenSSL是一個開放源代碼的實現了SSL及相關加密技術的軟體 包,在qt中,我們可以選擇直接支持,或者OpenSSL鏈接支持,這個參數也是為有需要者提供的。 以上是第三方庫的參數選擇,緊接著就是qt附加參數,在附加參數里,我們可以指定編譯的部分及加入參數來獲取信息。 -make -nomake 一 句話,說明,就說我可以這兩個參數選擇哪些我要編譯,哪些我不需要,在 libs tools examples demos docs translations這些里你可以選擇,比如examples,並不重要,可以放在-nomake後,這樣編譯過程中就不會編譯這部分了。通過適當的 選擇,我們可以大大加快編譯的速度,這對配置較差的機子來說有著積極意義。 -R <string> -l <string> 這兩個參數是為編譯時增加一個庫的運行路徑及頭文件的路徑,比如使用tslib作為開發觸摸驅動時,我們就應使用這兩個參數來指定tslib的庫路徑和頭文件路徑。 -no-rpath -rpath 這個參數比較難於理解,簡單地說,就是告訴動態載入器,到-rpath指定的目錄中尋找編譯時須要的動態鏈接庫,語法就與上面的參數結合,比如 -rpath -R/home/xxxx。 -continue 這個參數的作用就是當出現錯誤時依然進行配置編譯,換我是不會加上的。 -verbose, -v 這個參數就很眼熟,在前面的文章中有過詳細介紹,簡言之,就是顯示配置的每一步的具體信息。 -no-optimized-qmake -optimized-qmake 是否編譯生成優化過的qmake,沒啥大用,也屬於可有可無的參數。 -no-nis -nis 是否編譯NIS支持,NIS(網路信息服務)是一個提供目錄服務的RPC(遠程過程調用)應用服務,當然沒網路需要的可以再次華麗地無視。 -no-cups -cups 是 否編譯CUPS支持,是不是想問什麼用啊?~~~~囧,開列印店用的。好了,不說冷笑話,CUPS給Unix/Linux用戶提供了一種可靠有效 的方法來管理列印。它支持IPP,並提供了LPD,SMB(服務消息塊,如配置為微軟WINDOWS的列印機)、JetDirect等介面。CUPS還可 以瀏覽網路列印機。它的開發提供者是大名鼎鼎的「水果生產商」----蘋果公司。 -no-iconv -iconv 選擇是否編譯iconv支持,iconv是一個計算機程序以及一套應用程序編程介面的名稱。它的作用是在多種國際編碼格式之間進行文本內碼的轉換。這對跨語言Qt開發人員來說是很有用的,當然,考慮到中文的編碼,我也選擇加入支持。 -no-pch -pch 是 否支持預編譯過的頭文件。預編譯頭就是把一個工程中的一部分代碼,預先編譯好放在一個文件里(通常以.pch為擴展名),這個文件就稱為預編譯頭 文件。這些預先編譯好的代碼在工程開發的過程中不會被經常改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。媽媽經常說:不懂就要學。我說:不 懂就加上。。。 no-dbus -dbus -dbus-linked 是否編譯編譯QtDBus模塊。dbus是freedesktop下開源的Linux IPC通信機制,本身Linux 的IPC通信機制包括,管道(fifo),共享內存,信號量,消息隊列,Socket等。在Qt中DBUS是有單獨的模塊的,可見其重要性。 -rece-relocations 對於額外的庫鏈接器優化,可以減少編譯中的再定位。 no-separate-debug-info -separate-debug-info 是否存儲debug信息在.debug,一般為了查錯,還是選擇存儲吧。 -xplatform target 相當淺顯的參數,即交叉編譯的目標平台,一般來說根據你所要移植的目標板來確定。 -no-feature-<feature> -feature-<feature> 選 取qte的feature編譯,對於這個,我理解為特性,特性的描述你可以參考src/corelib/global/qfeatures.txt,在這 裡面對於每個特性都有比較充分的講解。對於特性地選擇,也是要根據開發需求進行,如果裁剪適當,能大大為qte庫瘦身。 -embedded <arch> 嵌入式平台架構選擇,可以選擇arm,mips,x86及generic,視你的目標平台決定吧。 -armfpa -no-armfpa 這個參數也只是針對ARM平台的,是否加入對於基於ARM的浮點數格式的支持,通常,這個參數在編譯時會自動選擇。 -little-endian -big-endian 目標平台的大端和小端選擇,這應該是常識了,如果這不知道,就不要來混嵌入式了 -host-little-endian -host-big-endia 主機平台的大端和小端選擇,屬於雞肋的參數,不選擇也會在配置時自動選擇。 -no-freetype -qt-freetype -system-freetype 選擇freetype,FreeType庫是一個完全免費(開源)的、高質量的且可移植的字體引擎,它提供統一的介面來訪問多種字體格式文件,在嵌入式開發中,有套可使用的字體對於中文開發至關重要,本人一般使用文泉驛字體。 -qconfig local 使用本地的qconfig配置文件來替代全部參數配置,有需要的可以去研究下,可以裁剪控制項級別的參數。 -depths <list> 顯示的像素位深,也是根據需要來進行吧。 -qt-decoration-<style> -plugin-decoration-<style> -no-decoration-<style> 這個是選擇qt的樣式風格,對於需要美化界面的項目來說,可以好好選擇下。 -no-opengl -opengl <api> 是否加入opengl的支持,OpenGL是個專業的3D程序介面,是一個功能強大,調用方便的底層3D圖形庫。不過對於一般的開發來說,似乎有很少用到的地方。 -qt-gfx-<driver> -plugin-gfx-<driver> -no-gfx-<driver> 這個是相當重要的一個參數,選擇QtGui的圖形顯示驅動,比如我們在pc上使用qvfb模擬時,就應該加入對qfvb的支持。我們可以在 linuxfb,transformed,qvfb,vnc,multiscreen這幾個中選擇。在平常的開發板上,選擇linuxfb即可。 -qt-kbd-<driver> -plugin-kbd-<driver> -no-kbd-<driver> 選擇鍵盤的驅動支持,可以支持usb鍵盤,串口鍵盤等等,也是在tty,usb ,sl5000, yopy, vr41xx ,qvfb中選擇。 qt-mouse-<driver> -plugin-mouse-<driver> -no-mouse-<driver> 滑鼠的驅動支持,一般都會選擇tslib,可以完美地支持觸摸屏,在pc,bus,linuxtp,yopy,vr41xx,tslib,qvfb中選擇吧。 -iwmmxt 加入iWMMXt指令的編譯,也只是部分XScale架構才具有。 -no-glib -glib 是否加入glib庫的支持,glib庫對應即gtk庫,就也是說加入後可以使用gtk。

6. 如何在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刪掉。

7. 如何將freemodbus協議棧移植到linux下

(二)在HHARM2410-R3上的移植
完成了在普通red hat上的安裝,熟悉了藍牙協議棧一些基本的東西,下面的任務就是把協議棧搬到開發板上了。
第一步當然是內核了,由於華恆的內核代碼改過,我也不知道從bluez上下載的patch能不能使用,試試看了,只好。
# cd /HHARM2410/kernel
# gzip -dc ~/patch-2.4.18-mh15.gz | patch -p1
# find ./ -name '*rej'
./fs/cramfs/inode.c.rej
不好,有文件不能patch,看看是針對cramfs文件系統的patch,我也不清楚為什麼bluez的patch會修改到cramfs,不過我想 問題應該不大。內核源代碼關於bluetooth的部分華恆應該沒有改過,因此patch的主要部分應該是沒有問題的。如果內核編譯後發生問題,我想大概 也只有把內核代碼翻出來看了。
先就這樣了,用用試試看好了。與普通pc上的類似,只不過有些是m的現在統統為y了。我的配置關於Bluez的部分設置為:
#
# Bluetooth support
#
CONFIG_BLUEZ=y
CONFIG_BLUEZ_L2CAP=y
# CONFIG_BLUEZ_SCO is not set
CONFIG_BLUEZ_RFCOMM=y
CONFIG_BLUEZ_RFCOMM_TTY=y
CONFIG_BLUEZ_BNEP=y
CONFIG_BLUEZ_BNEP_MC_FILTER=y
CONFIG_BLUEZ_BNEP_PROTO_FILTER=y
# CONFIG_BLUEZ_HIDP is not set
#
# Bluetooth device drivers
#
CONFIG_BLUEZ_HCIUSB=y
# CONFIG_BLUEZ_HCIUSB_SCO is not set
# CONFIG_BLUEZ_HCIUART is not set
# CONFIG_BLUEZ_HCIBFUSB is not set
# CONFIG_BLUEZ_HCIDTL1 is not set
# CONFIG_BLUEZ_HCIBT3C is not set
# CONFIG_BLUEZ_HCIBLUECARD is not set
# CONFIG_BLUEZ_HCIBTUART is not set
# CONFIG_BLUEZ_HCIVHCI is not set

device部分就設了個USB的,其他的就不設置了。
下面繼續make dep;make zImage的常規過程,OK,沒有發生編譯問題,可以稍微舒口氣了。
下面要移植Bluez的基礎庫了,在Redhat 9下執行
# ldd /usr/lib/libbluetooth.so.1.0.17
libc.so.6 => /lib/libc.so.6 (0x4002c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
發現沒有依賴什麼莫名其妙的庫,應該換個編譯器就可以了,configure一下就可以了。我的配置命令很簡單:
# ./configure --host=armv4l --prefix=/HHARM2410/applications/bluezport/libs CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib
LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld
# make
# make install
OK了,到了/HHARM2410/applications/bluezport/libs下看看,我也不清楚為什麼,居然只有.a和.la的靜態庫,沒有動態庫。只好自己動手,到bluz-libs-2.17/src/下,自己編譯動態庫:
# /opt/host/armv4l/bin/armv4l-unknown-linux-gcc -shared -o libbluetooth.so.1.0.17 bluetooth.o hci.o sdp.o
再做兩個符號連接
# ln -s libbluetooth.so.1.0.17 libbluetooth.so
# ln -s libbluetooth.so.1.0.17 libbluetooth.so.1
好了,庫交叉編譯完畢,mv到/HHARM2410/application/bluezport/libs/lib文件夾下就可以了。

接著移植Bluez的工具集。與庫類似,先看一下各個程序需要用到什麼庫,比如:
#ldd /usr/sbin/hcid
libbluetooth.so.1 => /usr/lib/libbluetooth.so.1 (0x40035000)
libc.so.6 => /lib/libc.so.6 (0x40042000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
挨個試試需要用的工具,發現需要的庫華恆和Bluez都提供了,應該換個編譯器編譯一下就可以了。編譯之前我為了到板子上與我自己的手機連接方便修改 了bluez-utils-2.17/hcid/security.c文件,在init_security_data函數中的設置默認的密碼,非常簡單地 改了兩行:
strcpy(hcid.pin_code, "123");
hcid.pin_len = 3;
然後configure我想就行了,我的configure設置為:
# ./configure --prefix=/HHARM2410-R3/applications/bluezport/utils --includedir=/HHARM2410-R3/applications/bluezport/libs/include --libdir=/HHARM2410-R3/applications/bluezport/libs/lib --with-bluez=/HHARM2410-R3/applications/bluezport/libs --disable-test --disable-cups --disable-pcmia --host=armv4l CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld
# make
我在這步make的時候出現了一點小錯誤,好像是說PATH_MAX沒有定義,這個是LINUX設置的存放路徑名緩沖區的最大長度。應該是少包含了一個頭文件造成的。我沒有去仔細考究,就在當前文件下的config.h中添加了三行:
#ifndef PATH_MAX
#define PATH_MAX 4095/* PAGE_SIZE - 1 */
#endif
採用簡單粗魯的添加定義的方式。再make,通過。
# make install
好了,工具集都在/HHARM2410-R3/applications/bluezport/util下了
最後,由於在PC的LINUX下的默認pin_helper /usr/bin/bluepin是用python寫的代碼,在2410上當然不能用了,所以要自己寫一個pin_helper的程序。翻翻 /usr/bin/bluepin的代碼以及hcid/security.c的代碼,事實上hcid進程在驗證PIN code的時候開了一個pipe指向pin_helper進程的標准輸出,pin_helper進程向用戶詢問PIN code,如果用戶輸入密碼XXXX就以"PIN:XXXX"的形式寫到標准輸出中去,如果用戶reject就寫個"ERR"回去。
我以一種最簡單的方式實現pin_helper程序,即固定地寫一個code回去,比如123,犧牲安全性。
用腳本實現就是:
#!/bin/sh

echo "PIN:123"
用C實現一個就是:
#include <stdio.h>

int main(int argc, char* argv[])
{
printf("PIN:123");
}
交叉編譯成my_pin_helper再放到板子的/usr/bin下,那麼就可以把板子的hcid.conf修改成:
pin_helper /usr/pin/my_pin_helper
後來,我在板子上也用MiniGUI寫了一個pin_helper,也挺簡單的。

好了,一切准備完畢,做好ramdisk,記得在/dev下mknod幾個rfcomm,放到板子上,可以運行!
插上USB適配器,連模塊都不用probe
# hciconfig hci0 up
# hcid -f /etc/bluetooth/hcid.conf
# hciconfig -a

8. 如何安裝arm-linux-gcc

這是readme文件 1.arm-gcc-4.4.1-20100409.tar.gz 交叉編譯器,將其解壓 tar zxvf arm-gcc-4.4.1-20100409.tar.gz 到當前目錄 當前目錄將出現usr/local/arm/4.4.1的目錄,將其中的arm目錄拷貝到 /usr/local/arm目錄 在/etc/profile下增加 export PATH=$PATH:/usr/local/arm/4.4.1/bin 然後 source /etc/profile 這樣交叉編譯器安裝成功 2.qtopia-core-opensource-src-4.2.2.tar.gz qt交叉編譯庫 解壓縮 拷貝 qmake.conf 到 mkspecs/qws/linux-arm-g++目錄 替換原有文件 ./configure -embedded arm -DQT_QLOCALE_USES_FCVT \ -qt-mouse-pc -qt-freetype -no-cups -no-nis -no-iconv \ -no-qdbus -qt-libjpeg -qt-libpng -qt-gif -qt-zlib \ -no-rpath -no-qt3support -no-largefile -no-accessibility \ -no-stl -no-libmng -little-endian -prefix /opt/QtPalmtop 提示第一次輸入yes 回車 第二次直接回車 sudo make; sudo make install 這樣將qt交叉編譯庫安裝到/opt/QtPalmtop下 增加/opt/QtPalmtop到nfs共享 開發板上將該共享目錄mnt到/opt/QtPalmtop下 在開發板上修改/etc/profile,增加三行 export LD_LIBRARY_PATH=/opt/QtPalmtop/lib export QWS_DISPLAY="LinuxFb:/dev/fb1" export QWS_SIZE="800*480" 利用其交叉編譯qt程序 /opt/QtPalmtop/bin/qmake -project /opt/QtPalmtop/bin/qmake make 將其qt程序目錄通過nfs共享到開發板,在開發板上運行 在開發板/etc/init.d/rcS文件增加運行的程序: mount pc機器相關目錄 運行程序 cd /sdcard/project_stu && ./project_stu -qws -nomouse & cd /sdcard && ./mplayer -x 540 -y 350 (某一個開發板上的視頻文件名)

熱點內容
解壓到當前文件夾右鍵 發布:2024-04-26 03:57:08 瀏覽:979
html5android教程視頻下載 發布:2024-04-26 03:09:59 瀏覽:867
伺服器的描述是什麼 發布:2024-04-26 03:08:32 瀏覽:394
個人加密 發布:2024-04-26 03:01:23 瀏覽:521
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:304
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:868
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12
得力文件夾5302 發布:2024-04-26 00:21:32 瀏覽:91