天天看點

Ubuntu下交叉編譯工具鍊的使用記錄(基于C++)

1. 前言

最近項目windows下開發的差不多了,得知程式要最終在機器ARM闆子上運作,是以需要我安個虛拟機,在烏班圖下使用交叉編譯工具鍊将程式交叉編譯下。由于本人是第一次幹這個,挺新鮮的,這裡主要舉例記錄一下項目可執行程式.exe和lib庫的交叉編譯流程。歡迎共同交流。後續周末盡量全面的研究總結一下,再放上來。

2. 準備

一. 我在WindowsPC上,下載下傳安裝了Virtual Box最新版,免費小巧,新手使用,沒必要用VM Ware;知乎有一位答主教程很不錯,我按他來的,成功安裝。附上教程位址:win10虛拟機Oracle VM Virtual Box安裝和使用教程

然後安裝Ubuntu,同樣上述寶藏教程說的很詳細,不多介紹,放一張安裝好的圖:

Ubuntu下交叉編譯工具鍊的使用記錄(基于C++)

二. 然後就是交叉編譯工具鍊的安裝了,這裡自取,也可以自行下載下傳:

連結: https://pan.baidu.com/s/1C49LyC2rmO1Z90_Co98HpQ

提取碼: a74h

這裡說明一下本來打算自己安裝工具鍊,結果同僚給了一個.ova虛拟電腦自帶了工具鍊,是以很簡單我直接虛拟機導入這個虛拟電腦進去玩,真正工具鍊安裝教程有時間總結,各位可查找别的教程。

這裡我現成使用的是:

arm-linux-gnueabihf

網盤給的是arm-linux-gnueabi, 版本4.6.4

有關這兩個交叉編譯器的差別,請看這一篇部落格:賊雞兒詳細

3. 編譯生成arm可執行exe及lib庫

exe程式生成舉例:

① 在linux桌面home目錄下,建立一個項目檔案夾test;

② 在test檔案夾下建立兩個檔案夾,分别為bin 和 test,bin将來放所生成的exe,test放具體的源代碼及其他;

③ test——>test——>裡建立一個build檔案夾,存放編譯該項目生成的一些檔案,這些檔案随時可删除,重新編譯即可再次生成;建立一個src,功能自然是存放所有的cpp代碼檔案;建立一個CMakeLists.txt檔案,這個是關鍵,裡面要編寫一些配置用于該項目編譯。

tips:上述目錄結構可類比windows下項目,便于了解:

Ubuntu下交叉編譯工具鍊的使用記錄(基于C++)
重點!!! CMakeLists.txt内容,舉例如下:

# CMake最低版本要求

cmake_minimum_required(VERSION 2.8)

# 設定目标系統

#set(CMAKE_SYSTEM_NAME Linux)

#set(USER_PATH “/home/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux”)

# 設定工具鍊目錄

#set(tools ${USER_PATH}/bin/arm-linux-gnueabihf-g++)

# 設定編譯器位置

#set(CMAKE_C_COMPILER ${USER_PATH}/bin/arm-linux-gnueabihf-gcc)

#set(CMAKE_CXX_COMPILER ${USER_PATH}/bin/arm-linux-gnueabihf-g++)

#set(CMAKE_CROSSCOMPILING TRUE)

#set(CMAKE_SYSTEM_PROCESSOR arm)

#set(CMAKE_FIND_ROOT_PATH ${USER_PATH})

#set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

#set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

#set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

#set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# 項目資訊

project(test)

set(CMAKE_CXX_FLAGS “${CAMKE_CXX_FLAGS} -pthread”)

# C++11支援

add_definitions(-std=c++11)

add_definitions(-D_GLIBCXX_USE_NANOSLEEP)

# 添加頭檔案路徑

include_directories(${CMAKE_CURRENT_LIST_DIR}/include)

# 添加源檔案路徑,并将其儲存在變量source_path中

aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src source_path)

# message(STATUS “${CMAKE_CURRENT_LIST_DIR}”)

# 生成Exe

add_executable(${PROJECT_NAME} ${source_path})

# 指定生成路徑

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR}/…/Bin)

# 連接配接庫檔案

find_package(Threads)

target_link_libraries(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT})

# 開啟調試資訊

#set(CMAKE_BUILD_TYPE “Debug”)

#set(CMAKE_BUILD_TYPE “Release”)

#set(CMAKE_CXX_FLAGS_DEBUG “$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb”)

#set(CMAKE_CXX_FLAGS_RELEASE “$ENV{CXXFLAGS} -O3 -Wall”)

# 開啟所有警告

#set(CMAKE_CXX_FLAGS “-Wall”)

簡單介紹一下,幾大塊:

  1. 設定目标系統、設定工具鍊目錄、設定編譯器位置這三項配置,正是交叉編譯核心所在,調用交叉編譯器實作對項目的編譯;
  2. 項目資訊,project()括号裡的正是你的項目名;
  3. 下面的set…-pthread這一行和C++11支援的兩行,網上說是指定c++11支援必不可少的三項。
  4. 添加頭檔案路徑,不用多說,後面跟着的/include是你的include檔案夾位置,這裡如果所有頭檔案和cpp檔案放一塊了,那麼就沒有include檔案夾了;
  5. 生成exe和指定生成路徑這兩項互相關聯,即生成的exe放在哪裡,就是我們最初的bin檔案夾下;
  6. 連接配接庫檔案指的是如果你的項目有用到别的庫,那麼這裡要指向連結庫路徑
  7. 最後的開啟調試資訊和和所有警告是死的,嫌麻煩可以注釋掉。

tips1:第5點如果是生成lib庫,改為下面這幾行:

# 指定生成路徑

set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR}/…/lib)

# 生成靜态庫

add_library(${PROJECT_NAME} ${source_path})

target_link_libraries(${PROJECT_NAME} libpthread.a)

find_package(Threads)

target_link_libraries(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT})

tips2: CMAKE_CXX_FLAGS_指的是c++,如果是c,是CMAKE_C_FLAGS_

tips3:如果去掉CMakeLists.txt中的三大塊有關工具鍊的配置,再次編譯後,生成的程式就是可以在linux下運作的程式。此時指令行輸入生成的exe程式路徑名回車即可看到運作結果。

4. 指令行視窗編譯生成

步驟一: 在build檔案夾下右鍵打開指令視窗,輸入 cmake ..(cmake和兩個點之間空一格),此時類似于編譯該解決方案,之後生成一堆檔案如下圖;

Ubuntu下交叉編譯工具鍊的使用記錄(基于C++)

步驟二:再次輸入 make 指令,将該項目編譯生成exe或lib;

Ubuntu下交叉編譯工具鍊的使用記錄(基于C++)

OK,大功告成。

時間倉促,先寫這麼多,後續有時間再補全~

=================================================

補充更新~

今天上來突然翻到一篇很棒很棒的部落格,12萬+閱讀量足以說明一切。這麼好的東西,當然要貼出來廣為傳播,也給自己留個傳送門!

CMakeLists.txt文法介紹與執行個體演練

繼續閱讀