交叉編譯c語言
本篇文章旨在指導如何為飛凌OK3568-C開發板構建linux系統所需的軟體交叉編譯環境。對於C/C++代碼開發,只需在Ubuntu虛擬機中安裝RK3568對應的交叉編譯器(gcc/g++)即可。若要進行Qt開發,則需額外配置交叉編譯環境以編譯與RK3568配套的Qt源碼。以下為兩種環境配置方法的詳細步驟。
### C/C++交叉編譯環境配置
1. **下載aarch64類型的gcc**:
在Linaro官網獲取針對RK3568(Cortex-A55內核64位)開發板的GCC交叉編譯工具鏈。推薦下載:`gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz`。解壓後,配置環境變數並使用`aarch64-linux-gnu-gcc`或`aarch64-linux-gnu-g++`交叉編譯C或C++程序。
2. **交叉編譯C/C++程序測試**:
編寫一個簡單的C++測試程序(main.cpp),使用`aarch64-linux-gnu-g++`編譯並運行,驗證編譯環境正確性。
3. **板子的WIFI自動配網**:
使用腳本自動連接WIFI,確保開發過程中網路連通。將腳本加入開機自啟動程序中,實現自動連接。
### RK3568 Linux源碼編譯
- **基礎環境配置**:安裝必要的庫,如依賴包和Qt開發所需庫。安裝Linux版Qt Creator(可選)以方便Qt開發。
- **准備RK3568源碼**:從飛凌官方資料中復制源碼至Ubuntu虛擬機,解壓並准備好編譯環境。
- **編譯RK3568源碼**:確認虛擬機有足夠磁碟空間和內存。執行編譯腳本,選擇ok3568配置,完成編譯過程。編譯完成後,生成適合全燒寫或分步燒寫的鏡像文件。
- **內核單獨編譯**:如果僅修改內核代碼,可單獨編譯內核,簡化編譯過程。
### Qt程序交叉編譯測試
- **Qt程序交叉編譯**:利用RK3568源碼編譯結果中的工具進行Qt程序編譯測試,確保交叉編譯環境正常工作。
- **Qt程序在板子中運行**:通過ADB傳輸編譯出的可執行文件至板子,驗證Qt程序的正確運行。
### 總結
本文詳細介紹了為飛凌OK3568-C開發板搭建軟體開發環境的全過程,包括C/C++和Qt開發所需的交叉編譯環境配置。通過本文的步驟指導,開發者可以順利為該開發板構建Linux系統,並進行相應的編程工作。
『貳』 如何使用CMake進行交叉編譯
cmake交叉編譯配置
很多時候,我們在開發的時候是面對嵌入式平台,因此由於資源的限制需要用到相關的交叉編譯。即在你host宿主機上要生成target目標機的程序。裡面牽扯到相關頭文件的切換和編譯器的選擇以及環境變數的改變等,我今天僅僅簡單介紹下相關CMake在面對交叉編譯的時候,需要做的一些准備工作。
CMake給交叉編譯預留了一個很好的變數CMAKE_TOOLCHAIN_FILE,它定義了一個文件的路徑,這個文件即toolChain,裡面set了一系列你需要改變的變數和屬性,包括C_COMPILER,CXX_COMPILER,如果用Qt的話需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的話需要更改的BOOST_ROOT(具體查看相關Findxxx.cmake裡面指定的路徑)。CMake為了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。
toolChain腳本中設置的幾個重要變數
1.CMAKE_SYSTEM_NAME:
即你目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平台你就寫"Windows",如果你的嵌入式平台沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變數被設置了,CMake才認為此時正在交叉編譯,它會額外設置一個變數CMAKE_CROSSCOMPILING為TRUE.
2. CMAKE_C_COMPILER:
顧名思義,即C語言編譯器,這里可以將變數設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其他工具比如linker,binutils等,如果你寫的文件名帶有arm-elf等等前綴,CMake會識別到並且去尋找相關的交叉編譯器。
3. CMAKE_CXX_COMPILER:
同上,此時代表的是C++編譯器。
4. CMAKE_FIND_ROOT_PATH:
指定了一個或者多個優先於其他搜索路徑的搜索路徑。比如你設置了/opt/arm/,所有的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,然後才會去你自己的/usr/lib和/lib進行查找,如果你有一些庫是不被包含在/opt/arm裡面的,你也可以顯示指定多個值給CMAKE_FIND_ROOT_PATH,比如
set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)
該變數能夠有效地重新定位在給定位置下進行搜索的根路徑。該變數默認為空。當使用交叉編譯時,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡查找。
5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:
對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變數來說,一般都是調用宿主機的程序,所以一般都設置成NEVER
6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:
對FIND_LIBRARY()起作用,表示在鏈接的時候的庫的相關選項,因此這里需要設置成ONLY來保證我們的庫是在交叉環境中找的.
7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:
對FIND_PATH()和FIND_FILE()起作用,一般來說也是ONLY,如果你想改變,一般也是在相關的FIND命令中增加option來改變局部設置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH
8. BOOST_ROOT:
對於需要boost庫的用戶來說,相關的boost庫路徑配置也需要設置,因此這里的路徑即ARM下的boost路徑,裡面有include和lib。
9. QT_QMAKE_EXECUTABLE:
對於Qt用戶來說,需要更改相關的qmake命令切換成嵌入式版本,因此這里需要指定成相應的qmake路徑(指定到qmake本身)
toolChain demo
# this is required
SET(CMAKE_SYSTEM_NAME Linux)
# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)
# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)
這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做轉移,但目標平台是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。