鴻蒙HarmonyOS應用開發(fā)之使用命令行CMake構(gòu)建NDK工程

在很多復雜應用工程中帝雇,C++代碼工程是通過CMake等構(gòu)建系統(tǒng)以命令行方式來編譯構(gòu)建的浦妄,接下來介紹如何把已有的CMake工程切換到OpenHarmony工具鏈中,從而使用命令行CMake構(gòu)建該工程。

下載NDK開發(fā)包

  1. 推薦使用OpenHarmony正式發(fā)布的SDK包。下載鏈接請從OpenHarmony正式發(fā)布版本的 版本說明 中獲取

在Release Notes “從鏡像站點獲取” 章節(jié)下載轧铁。

根據(jù)系統(tǒng)的操作類型,下載對應的 SDK 包

  1. 從DevEco Studio的OpenHarmony SDK Manager中下載竟稳。

解壓NDK開發(fā)包

下載完成后属桦,將壓縮包放入創(chuàng)建好的文件夾下解壓熊痴,解壓完成效果如下圖所示

windows/linux 使用 SDK 包解壓完成效果如下圖所示:

mac系統(tǒng)下使用 SDK 包解壓

配置環(huán)境變量

如果只是在IDE中使用他爸,跳過以下步驟:

  1. 將NDK自帶的CMake編譯工具添加到環(huán)境變量中。
  • 配置 linux 系統(tǒng)下環(huán)境變量
      #打開.bashrc文件
      vim ~/.bashrc
      #在文件最后添加CMake路徑果善,具體路徑用實際放置SDK路徑代替
      export PATH=~/ohos-sdk/ohos-sdk/linux/native/build-tools/cmake/bin:$PATH
      #在命令行執(zhí)行source ~/.bashrc使環(huán)境變量生效
      source ~/.bashrc
  • 配置 mac 系統(tǒng)下環(huán)境變量
      # 在當前用戶目錄下
      # 打開 .bash_profile 文件
      # 文件如果不存在诊笤,創(chuàng)建即可
      vim ~/.bash_profile
      # 在文件最后添加 cmake 路徑,該路徑是自己的放置文件的路徑巾陕,之后保存退出
      export PATH=~/Ndk/mac-sdk-full/sdk/packages/ohos-sdk/darwin/native/build-tools/cmake/bin:$PATH
      # 在命令行執(zhí)行 source ~/.bash_profile 使環(huán)境變量生效
      source ~/.bash_profile
  • 配置 windows 下的環(huán)境變量

    右鍵點擊我的電腦讨跟,在下拉框中選擇我的電腦纪他,點擊高級系統(tǒng)設置,點擊環(huán)境變量晾匠,點擊Path后點編輯茶袒,點擊新建,將路徑添加進去凉馆,之后保存退出薪寓,打開cmd(若下一步不能夠?qū)崿F(xiàn),請重啟電腦嘗試)澜共。

驗證是否添加成功

打開命令框向叉,輸入F:\windows\native\build-tools\cmake\bin\cmake.exe -version,該路徑為cmake的路徑嗦董,依據(jù)自己實際安裝路徑

這樣就添加成功了

  1. 查看CMake默認路徑母谎。
    • linux 和 mac 系統(tǒng)環(huán)境下
#在命令行輸入which命令查詢當前CMake所在路徑
which cmake
#結(jié)果路徑與.bashrc中設置一致
~/ohos-sdk/ohos-sdk/linux/native/build-tools/cmake/bin/cmake
  • windows 系統(tǒng)環(huán)境下,cmake 安裝路徑為自己所配置的環(huán)境變量路徑
    通過 我的電腦->高級系統(tǒng)設置->環(huán)境變量->在 Path 對象中查看

使用NDK開發(fā)包編譯Native程序

應用開發(fā)者可以通過NDK開發(fā)包快速的開發(fā)出Native動態(tài)庫京革、靜態(tài)庫與可執(zhí)行文件奇唤。NDK開發(fā)包提供CMake編譯構(gòu)建工具腳本,下面通過編寫一個C/C++ demo工程來演示適配過程存崖。

demo工程內(nèi)容

下面是一個CMake的demo工程內(nèi)容冻记,此工程包含兩個目錄,include目錄包含此庫的頭文件来惧,src目錄包含全部源碼冗栗;src目錄包含兩個文件,sum.cpp的算法文件供搀,以及main.cpp的調(diào)用算法的主入口文件蔫慧,目標是編譯成一個可執(zhí)行程序,以及一個算法動態(tài)庫盐股。

demo目錄圖

demo
  ├── CMakeLists.txt
  ├── include
       └── sum.h
  └── src
       ├── CMakeLists.txt
       ├── sum.cpp
       └── main.cpp

根目錄CMakeLists.txt內(nèi)容

# 指定CMake的最小版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.16)

# 工程名稱译株,這里我們就叫HELLO
PROJECT(HELLO)

#添加一個子目錄并構(gòu)建該子目錄。
ADD_SUBDIRECTORY(src)

內(nèi)部CMakeLists.txt內(nèi)容

SET(LIBHELLO_SRC hello.cpp)

# 設置編譯參數(shù)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")   
 
# 設置鏈接參數(shù)屿脐,具體參數(shù)可以忽略涕蚤,純粹為了舉例
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--emit-relocs --verbose")    

# 添加一個libsum動態(tài)庫目標,編譯成功會生成一個libsum.so
ADD_LIBRARY(sum SHARED sum.cpp)

# 生成可執(zhí)行程序的诵,添加一個Hello的可執(zhí)行程序目標万栅,編譯成功會生成一個Hello可執(zhí)行程序
ADD_EXECUTABLE(Hello ${LIBHELLO_SRC})

# 指定Hello目標include目錄路徑
TARGET_INCLUDE_DIRECTORIES(Hello PUBLIC ../include)

# 指定Hello目標需要鏈接的庫名字
TARGET_LINK_LIBRARIES(Hello PUBLIC sum)

源碼內(nèi)容

hello.cpp源碼

#include <iostream>
#include "sum.h"

int main(int argc,const char **argv)
{
    std::cout<< "hello world!" <<std::endl;
    int total = sum(1, 100);
    std::cout<< "Sum 1 + 100=" << total << std::endl;
    return 0;
}

sum.h源碼

int sum(int a, int b);

sum.cpp源碼

#include <iostream>
    
int sum(int a, int b)
{
    return a + b;
}

編譯構(gòu)建demo工程

linux 和 mac 系統(tǒng)環(huán)境下

在工程目錄下,創(chuàng)建build目錄西疤,用來放置CMake構(gòu)建時產(chǎn)生的中間文件烦粒。注意: ohos-sdk是下載下來的SDK的根目錄,開發(fā)者需要自行替換成實際的下載目錄代赁。

  1. 采用OHOS_STL=c++_shared動態(tài)鏈接c++庫方式構(gòu)建工程扰她,如不指定兽掰,默認采用c++_shared。
 >mkdir build && cd build
 >cmake -DOHOS_STL=c++_shared -DOHOS_ARCH=armeabi-v7a -DOHOS_PLATFORM=OHOS -DCMAKE_TOOLCHAIN_FILE={ohos-sdk}/linux/native/build/cmake/ohos.toolchain.cmake ..
 >cmake --build .
  1. 采用OHOS_STL=c++_static靜態(tài)鏈接c++庫方式構(gòu)建工程徒役。
 >mkdir build && cd build
 >cmake -DOHOS_STL=c++_static -DOHOS_ARCH=armeabi-v7a -DOHOS_PLATFORM=OHOS -DCMAKE_TOOLCHAIN_FILE={ohos-sdk}/linux/native/build/cmake/ohos.toolchain.cmake ..
 >cmake --build .

命令中孽尽,OHOS_ARCH與OHOS_PLATFORM兩個變量最終會生成clang++的--target命令參數(shù),

在此例子中就是--target=arm-linux-ohos --march=armv7a兩個參數(shù)忧勿;

CMAKE_TOOLCHAIN_FILE指定了toolchain文件泻云,

在此文件中默認給clang++設置了--sysroot={ndk_sysroot目錄},告訴編譯器查找系統(tǒng)頭文件的根目錄狐蜕。

windows系統(tǒng)環(huán)境下

在windows下使用cmake進行編譯宠纯,與linux下不同的是,使用cmake要加入?yún)?shù) -G 選擇使用的生成器层释,直接回車會列出下面的生成器婆瓜。

這里使用的是cmake .. -G "Ninja" 引號里面跟的參數(shù)就是上圖查看的環(huán)境所支持的生成器,這里ndk中自帶的生成器是Ninja

Step 1. 同樣在工程目錄下創(chuàng)建 build 文件夾并執(zhí)行以下指令

 F:\windows\native\build-tools\cmake\bin\cmake.exe -G "Ninja" -D OHOS_STL=c++_shared -D OHOS_ARCH=armeabi-v7a -D OHOS_PLATFORM=OHOS                                                                     -D CMAKE_TOOLCHAIN_FILE=F:\windows\native\build\cmake\ohos.toolchain.cmake ..

注:如需debug調(diào)試贡羔,增加參數(shù) -D CMAKE_BUILD_TYPE=normal cmake路徑和編譯工具鏈ohos.toolchain.cmake路徑都是下載好的ndk路徑 執(zhí)行結(jié)果如下圖

這里生成的build.ninja文件就是我們需要的

Step 2. 讓我們用ninja指令來編譯生成目標文件廉白,其位置如下圖所示:

ninja -f build.ninja 或者用 cmake --build . 執(zhí)行結(jié)果如下

寫在最后

  • 如果你覺得這篇內(nèi)容對你還蠻有幫助,我想邀請你幫我三個小忙:
  • 點贊乖寒,轉(zhuǎn)發(fā)猴蹂,有你們的 『點贊和評論』,才是我創(chuàng)造的動力楣嘁。
  • 關(guān)注小編磅轻,同時可以期待后續(xù)文章ing??,不定期分享原創(chuàng)知識逐虚。
  • 想要獲取更多完整鴻蒙最新學習知識點聋溜,請移步前往小編:https://gitee.com/MNxiaona/733GH/blob/master/jianshu
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叭爱,隨后出現(xiàn)的幾起案子撮躁,更是在濱河造成了極大的恐慌,老刑警劉巖买雾,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件把曼,死亡現(xiàn)場離奇詭異,居然都是意外死亡漓穿,警方通過查閱死者的電腦和手機嗤军,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來器净,“玉大人型雳,你說我怎么就攤上這事当凡∩胶Γ” “怎么了纠俭?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浪慌。 經(jīng)常有香客問我冤荆,道長,這世上最難降的妖魔是什么权纤? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任钓简,我火速辦了婚禮,結(jié)果婚禮上汹想,老公的妹妹穿的比我還像新娘外邓。我一直安慰自己,他們只是感情好古掏,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布损话。 她就那樣靜靜地躺著,像睡著了一般槽唾。 火紅的嫁衣襯著肌膚如雪丧枪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天庞萍,我揣著相機與錄音拧烦,去河邊找鬼。 笑死钝计,一個胖子當著我的面吹牛恋博,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播私恬,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼交播,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了践付?” 一聲冷哼從身側(cè)響起秦士,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎永高,沒想到半個月后隧土,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡命爬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年曹傀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饲宛。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡皆愉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幕庐,我是刑警寧澤久锥,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站异剥,受9級特大地震影響瑟由,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冤寿,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一歹苦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧督怜,春花似錦殴瘦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至究流,卻和暖如春辣吃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芬探。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工神得, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偷仿。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓哩簿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酝静。 傳聞我的和親對象是個殘疾皇子节榜,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容