在很多復雜應用工程中帝雇,C++代碼工程是通過CMake等構(gòu)建系統(tǒng)以命令行方式來編譯構(gòu)建的浦妄,接下來介紹如何把已有的CMake工程切換到OpenHarmony工具鏈中,從而使用命令行CMake構(gòu)建該工程。
下載NDK開發(fā)包
- 推薦使用OpenHarmony正式發(fā)布的SDK包。下載鏈接請從OpenHarmony正式發(fā)布版本的 版本說明 中獲取
在Release Notes “從鏡像站點獲取” 章節(jié)下載轧铁。
根據(jù)系統(tǒng)的操作類型,下載對應的 SDK 包
- 從DevEco Studio的OpenHarmony SDK Manager中下載竟稳。
解壓NDK開發(fā)包
下載完成后属桦,將壓縮包放入創(chuàng)建好的文件夾下解壓熊痴,解壓完成效果如下圖所示
windows/linux 使用 SDK 包解壓完成效果如下圖所示:
mac系統(tǒng)下使用 SDK 包解壓
配置環(huán)境變量
如果只是在IDE中使用他爸,跳過以下步驟:
- 將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ù)自己實際安裝路徑
這樣就添加成功了
- 查看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ā)者需要自行替換成實際的下載目錄代赁。
- 采用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 .
- 采用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