1. 前言
最近項目windows下開發的差不多了,得知程式要最終在機器ARM闆子上運作,是以需要我安個虛拟機,在烏班圖下使用交叉編譯工具鍊将程式交叉編譯下。由于本人是第一次幹這個,挺新鮮的,這裡主要舉例記錄一下項目可執行程式.exe和lib庫的交叉編譯流程。歡迎共同交流。後續周末盡量全面的研究總結一下,再放上來。
2. 準備
一. 我在WindowsPC上,下載下傳安裝了Virtual Box最新版,免費小巧,新手使用,沒必要用VM Ware;知乎有一位答主教程很不錯,我按他來的,成功安裝。附上教程位址:win10虛拟機Oracle VM Virtual Box安裝和使用教程
然後安裝Ubuntu,同樣上述寶藏教程說的很詳細,不多介紹,放一張安裝好的圖:
二. 然後就是交叉編譯工具鍊的安裝了,這裡自取,也可以自行下載下傳:
連結: 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下項目,便于了解:
重點!!! 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”)
簡單介紹一下,幾大塊:
- 設定目标系統、設定工具鍊目錄、設定編譯器位置這三項配置,正是交叉編譯核心所在,調用交叉編譯器實作對項目的編譯;
- 項目資訊,project()括号裡的正是你的項目名;
- 下面的set…-pthread這一行和C++11支援的兩行,網上說是指定c++11支援必不可少的三項。
- 添加頭檔案路徑,不用多說,後面跟着的/include是你的include檔案夾位置,這裡如果所有頭檔案和cpp檔案放一塊了,那麼就沒有include檔案夾了;
- 生成exe和指定生成路徑這兩項互相關聯,即生成的exe放在哪裡,就是我們最初的bin檔案夾下;
- 連接配接庫檔案指的是如果你的項目有用到别的庫,那麼這裡要指向連結庫路徑
- 最後的開啟調試資訊和和所有警告是死的,嫌麻煩可以注釋掉。
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和兩個點之間空一格),此時類似于編譯該解決方案,之後生成一堆檔案如下圖;
步驟二:再次輸入 make 指令,将該項目編譯生成exe或lib;
OK,大功告成。
時間倉促,先寫這麼多,後續有時間再補全~
=================================================
補充更新~
今天上來突然翻到一篇很棒很棒的部落格,12萬+閱讀量足以說明一切。這麼好的東西,當然要貼出來廣為傳播,也給自己留個傳送門!
CMakeLists.txt文法介紹與執行個體演練