Ⅰ 海思平台配置toolchain.cmake
交叉編譯,在我們的host宿主機器上需要生成target目標機器的程序, 使用CMake的Toolchain管理這里的各種環境變數和配置,就很好.
CMake給交叉編譯預留了一個變數-- CMAKE_TOOLCHAIN_FILE , 它定義了一個文件的路徑, 這個文件就是 toolchain ,我們可以在裡面配置 C_COMPILER , CXX_COMPILER ,如果用Qt的話需要更改 QT_QMAKE_EXECUTABLE 以及如果用 BOOST 的話需要更改的 BOOST_ROOT (具體查看相關 Findxxx.cmake 裡面指定的路徑), 因此,這個 toolchain 內嵌了一系列需要改變並且需要set的交叉環境的設置.
下面歸納一些比較重要的:
下面是一個常規的配置
這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條 -DCMAKE_TOOLCHAIN_FILE=./cross.toolChain.cmake ,更爽的是,如果你有很多程序需要做轉移,但目標平台是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。
稍微大一點的項目都會用到一些外部依賴庫或者tool,CMake提供了 FIND_PROGRAM() , FIND_LIBRARY() , FIND_FILE() , FIND_PATH() and FIND_PACKAGE() 等命令來進行外部依賴的搜索查找。
但是有個問題,假如我們在給一個ARM處理器的移動設備做交叉編譯,其中需要尋找 libjpeg.so ,假如 FIND_PACKAGE(JPEG) 返回的是 /usr/lib/libjpeg.so ,那麼這就會有問題,因為找到的這個 so 庫只是給你的宿主機系統(例如一個x86的Ubuntu主機)服務的,不能用於Arm系統。所以你需要告訴CMake去其它地方去查找,這個時候你就需要配置以下的變數了:
在工程中一般通過如下步驟, 進入工程文件, 創建 arm-himix200-linux.cmake 文件, 內容是:
然後創建build文件夾, 進行編譯(注意, 需要指定 CMAKE_MAKE_PROGRAM , 不指定的話好像編譯有問題...):
在我的 toolchain 文件中,我指定:
因為我項目中 CMakeLists.txt 中需要查找 OpenSSL 和 curl , 因此會用到CMake自帶的 FindOpenSSL.cmake 和 FindCurl.cmake 兩個腳本, 他們會用到 Findxxx 命令, 會去我指定的目錄去搜索對應的庫
https://www.cnblogs.com/rickyk/p/3875334.html
http://www.cmake.org/Wiki/CMake_Cross_Compiling