中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

如果是創(chuàng)建的網(wǎng)站網(wǎng)站快速排名優(yōu)化價格

如果是創(chuàng)建的網(wǎng)站,網(wǎng)站快速排名優(yōu)化價格,wordpress 日期作者,建設(shè)工程教育網(wǎng)站在OpenHarmony應(yīng)用開發(fā)中選擇Native C 開發(fā)方式需要使用OpenHarmony NDK工具,或者想移植一個C/C 的三方庫到OpenHarmony中也可以使用NDK。NDK使用到的編譯工具是cmake,也就是CMakeLists.txt那一套。Native C 應(yīng)用開發(fā)方式可以做直接編譯三方庫的so庫再利…

在OpenHarmony應(yīng)用開發(fā)中選擇Native C ++開發(fā)方式需要使用OpenHarmony NDK工具,或者想移植一個C/C ++的三方庫到OpenHarmony中也可以使用NDK。NDK使用到的編譯工具是cmake,也就是CMakeLists.txt那一套。Native C ++應(yīng)用開發(fā)方式可以做直接編譯三方庫的so庫再利用NAPI框架實現(xiàn)能力的調(diào)用(只需要在三方庫原生的CMakeLists.txt中修改小部分的內(nèi)容就可以實現(xiàn))。


目錄

  • 一、OpenHarmony NDK
  • 二、獲取NDK的方式
    • 2.1 從每日構(gòu)建中獲取
    • 2.2 編譯源碼得到SDK中的NDK
  • 二、NDK目錄
  • 三、linux下使用NDK編譯庫文件和可執(zhí)行文件
    • 3.1 使用NDK編譯一個簡單demo
    • 3.2 進(jìn)行cmake編譯
      • 3.2.1 NDK自帶的cmake編譯工具添加到環(huán)境變量
      • 3.2.2 安裝make
      • 3.2.3 cmake的幾個參數(shù)
      • 3.2.4 使用CMake進(jìn)行構(gòu)建,并傳遞工具鏈文件及cmake參數(shù)
      • 3.4.5 使用CMake進(jìn)行構(gòu)建,選擇ninja生成器并生成編譯流程圖
      • 3.4.6 使用NDK中的cmake-gui進(jìn)行圖形化操作編譯

一、OpenHarmony NDK

  • NDK (原生開發(fā)套件) 是一套工具,使開發(fā)者能夠在 OpenHarmony hap應(yīng)用中使用 C/C++ 代碼。
  • NDK提供了一系列的工具可以幫助開發(fā)者快速的開發(fā)C/C++的動態(tài)庫、靜態(tài)庫和可執(zhí)行文件。
  • OpenHarmony 應(yīng)用開發(fā)的Native C++開發(fā)方式就要依賴NDK。NDK被包含在OpenHarmony SDK中??梢栽贒evEco Studio使用 NDK 將 C/C ++ 代碼編譯到so庫中,然后使用 DevEco Studio 的構(gòu)建插件hvigor-ohos-plugin將so庫打包到 Hap 中。ArkTS代碼隨后可以通過NAPI框架調(diào)用SO庫中的函數(shù)。
    9f9c443fd275d73a5cc875bfb9e433f.jpgimage.png

二、獲取NDK的方式

2.1 從每日構(gòu)建中獲取

  • 每日構(gòu)建地址: http://ci.openharmony.cn/dailys/dailybuilds

  • 組件形態(tài)選擇ohos-sdk,版本選擇最新版本的sdk一般是沒有問題的(但是筆者之前遇到下載的ndk中的clang工具找不到libatomic.so無法工作的情況的情況)
    eeec91bc355a36fb308d55a4c7c7613.jpg

  • 下載解壓后可以得到如下文件,根據(jù)linux或者windows端解壓不同文件得到sdk
    b7a65dd5442f79cc917e7bf792a8543.jpg

2.2 編譯源碼得到SDK中的NDK

安裝依賴
./build/build_scripts/env_setup.sh執(zhí)行完上述命令后記得執(zhí)行source ~/.bashrc或者重啟終端
source ~/.bashrc安裝編譯SDK需要的依賴包(編譯鏡像的時候是不依賴這些包的)
sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev./build.sh --product-name ohos-sdk --ccache --build-target ohos_ndk

寫文章提的issue https://gitee.com/openharmony/build/issues/I6H8IO?from=project-issue

  • 在對應(yīng)的目錄底下找到編譯成功的NDK,相關(guān)路徑out/sdk/packages/ohos-sdk/linux/native,根據(jù)linux或者windows端解壓不同文件得到sdk

image.png

二、NDK目錄

native├── NOTICE.txt                                        聲明文件├── build│     └── cmake│           ├── ohos.toolchain.cmake             ---->編譯的工具鏈│           └── sdk_native_platforms.cmake       ---->編譯的工具鏈(在DevEco Studio中編譯打包so要用到)                 ├── build-tools                                  ---->cmake編譯工具所在目錄(NDK提供的編譯工具)├── llvm                                         ---->編譯器所在目錄(NDK提供的編譯工具)├── sysroot                                      ---->編譯器的 sysroot 目錄,存放 SDK 內(nèi)部的已經(jīng)包含的庫和對應(yīng)的頭文件├── ndk_system_capability.json                   ---->NDK自帶so庫能力描述文件├── nativeapi_syscap_config.json                 ---->調(diào)用NDK自帶so庫能力相關(guān)頭文件├── docs                                         ---->調(diào)用NDK自帶so庫能力相關(guān)文檔└── oh-uni-package.json                          ---->SDK 信息描述
  • llvm中bin目錄下的編譯器有
FileCheck    clang-format      ld64.lld        lldb-vscode      llvm-cxxfilt     llvm-objdump   llvm-strip       yaml2obj
clang        clang-tidy        lld             llvm-addr2line   llvm-dis         llvm-profdata  llvm-symbolizer
clang++      clangd            lld-link        llvm-ar          llvm-lib         llvm-ranlib    not
clang-12     count             lldb            llvm-as          llvm-link        llvm-readelf   sancov
clang-check  dsymutil          lldb-argdumper  llvm-cfi-verify  llvm-modextract  llvm-readobj   sanstats
clang-cl     git-clang-format  lldb-mi         llvm-config      llvm-nm          llvm-size      scan-build
clang-cpp    ld.lld            lldb-server     llvm-cov         llvm-objcopy     llvm-strings   scan-view

三、linux下使用NDK編譯庫文件和可執(zhí)行文件

3.1 使用NDK編譯一個簡單demo

  • 在這里使用這個OpenHarmony倉庫的這個demo https://gitee.com/openharmony/third_party_musl/tree/master/ndk-test/ndk-test/src/shared-library 這個demo編譯前的目錄結(jié)構(gòu)
shared-library            
├── CMakeLists.txt      外部CMakeLists.txt    
├── include             頭文件目錄
│   └── shared
│       └── Hello.h      
└── src                 源文件目錄├── CMakeLists.txt  內(nèi)部CMakeLists.txt  ├── Hello.cpp└── main.cpp
  • 外部CMakeLists.txt
#cmake的版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
#工程名稱
PROJECT(HELLO_LIBRARY)
#添加一個子目錄并構(gòu)建該子目錄
ADD_SUBDIRECTORY(src)

cmake的內(nèi)置命令是不區(qū)分大小寫的,因此add_subdirectory與ADD_SUBDIRECTORY作用一致。但是cmake的所有變量都是區(qū)分大小寫的

  • 內(nèi)部CMakeLists.txt
#設(shè)置可執(zhí)行文件輸出路徑
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/output)
# 設(shè)置so庫文件輸出路徑
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/output)############################################################
# Create a library
#############################################################SHARED表示生成的是動態(tài)庫,動態(tài)庫的名字是hello_shared_library。生成動態(tài)庫的源文件是Hello.cpp
ADD_LIBRARY(hello_shared_library SHARED Hello.cpp)
#為生成的動態(tài)庫添加一個別名,后續(xù)hello::library可使用來替代hello_shared_library
ADD_LIBRARY(hello::library ALIAS hello_shared_library)#為指定目標(biāo)hello_shared_library添加頭文件搜索路徑(這個指定目標(biāo)決不能是alias target,也就是指定的別名hello::library)
TARGET_INCLUDE_DIRECTORIES(hello_shared_libraryPUBLIC ${PROJECT_SOURCE_DIR}/include)############################################################
# Create an executable
############################################################# 使用指定的源文件main.cpp創(chuàng)建出一個可執(zhí)行文件hello_shared_binary 
ADD_EXECUTABLE(hello_shared_binarymain.cpp)#TARGET_LINK_LIBRARIES指令的作用為將目標(biāo)文件與庫文件進(jìn)行鏈接
#將可執(zhí)行文件hello_shared_binary與庫文件hello::library進(jìn)行鏈接
TARGET_LINK_LIBRARIES( hello_shared_binaryPRIVATE hello::library)	

3.2 進(jìn)行cmake編譯

3.2.1 NDK自帶的cmake編譯工具添加到環(huán)境變量

1、第一種方法:

#將其臨時加入環(huán)境變量中(適用于臨時想用用NDK)
export PATH=$PATH:/ohos-sdk/linux/native/build-tools/cmake/bin(你自己解壓的NDK目錄)

2、第二種方法:

#將其永遠(yuǎn)加入環(huán)境變量中
#打開.bashrc文件
vim ~/.bashrc
#在文件最后添加cmake路徑,該路徑是自己的放置文件的路徑,之后保存退出
export PATH=/ohos-sdk/linux/native/build-tools/cmake/bin:$PATH
#在命令行執(zhí)行source ~/.bashrc使環(huán)境變量生效
source ~/.bashrc

3、查看環(huán)境變量添加是否成功

 cmake -version

image.png
可知cmake的版本是3.16.5 ,所以編寫CMakeLists.txt可參考的鏈接為 https://cmake.org/cmake/help/v3.16/guide/tutorial/

3.2.2 安裝make

  • 如果沒有安裝make會出現(xiàn)以下報錯,則執(zhí)行sudo apt-get install make。(如果已經(jīng)安裝make,請忽略)
    image.png

3.2.3 cmake的幾個參數(shù)

1、OHOS_STL參數(shù),其類型可以是c++_sharedc++_static,默認(rèn)是c++_shared
image.png

2、OHOS_ARCH參數(shù)(設(shè)置應(yīng)用程序二進(jìn)制接口ABI),其類型是armeabi-v7a、x86_64 ,默認(rèn)值是arm64-v8a。每一種ABI定義了相應(yīng)的二進(jìn)制文件。

  • armeabi-v7a (選擇這個是編譯32位的二進(jìn)制文件)
  • arm64-v8a (選擇這個是編譯64位的二進(jìn)制文件)
  • x86_64 (現(xiàn)在不使用,OpenHarmony現(xiàn)在在適配x86的芯片)

3、OHOS_PLATFORM參數(shù),其類型為OHOS(只能選擇OHOS平臺)

4、 CMAKE_TOOLCHAIN_FILE參數(shù)指向的是工具鏈文件所在的位置,就是ohos.toolchain.cmake的路徑(對于編譯不同平臺二進(jìn)制文件是很重要的)。

  • build目錄中的工具鏈文件ohos.toolchain.cmake,cmake編譯時需要讀取該文件中的默認(rèn)值,比如編譯器的選擇、編譯平臺,例如ohos.toolchain.cmake文件中,
# Common default settings
39:if(NOT DEFINED OHOS_PLATFORM_LEVEL)set(OHOS_PLATFORM_LEVEL 1)endif()
43:if(NOT DEFINED OHOS_TOOLCHAIN)set(OHOS_TOOLCHAIN clang)endif()
47:if(NOT DEFINED OHOS_STL)set(OHOS_STL c++_shared)endif()
51:if(NOT DEFINED OHOS_PIE)set(OHOS_PIE TRUE)endif()
55:if(NOT DEFINED OHOS_ARM_NEON)set(OHOS_ARM_NEON thumb)endif()
60:if(NOT DEFINED OHOS_ARCH)set(OHOS_ARCH arm64-v8a)endif()
  • 在編譯時需要指出該文件的所在路徑,以便于cmake在編譯時定位到該文件。在編譯的時候需要為cmake指定參數(shù)來控制編譯目標(biāo)的屬性。

3.2.4 使用CMake進(jìn)行構(gòu)建,并傳遞工具鏈文件及cmake參數(shù)

# dmeo目錄下創(chuàng)建build目錄,用來放置cmake構(gòu)建時產(chǎn)生的中間文件。
mkdir build && cd build# 傳遞OHOS_STL(可選,默認(rèn)就是c++_shared)、OHOS_ARCH、OHOS_PLATFORM、工具鏈文件
# CMAKE_TOOLCHAIN_FILE是ohos.toolchain.cmake具體放置的路徑
# 這一步會檢查CMakeLists.txt是否有語法錯誤 
# 不要忘記在ohos.toolchain.cmake路徑后面加上 ..
cmake -D OHOS_STL=c++_shared -D OHOS_ARCH=armeabi-v7a -D OHOS_PLATFORM=OHOS -D CMAKE_TOOLCHAIN_FILE=/xxx/build/cmake/ohos.toolchain.cmake ..cmake --build .

1、執(zhí)行如下過程如下:
image.png

2、可以注意到執(zhí)行cmake --build .時會有warning: -Wunused-command-line-argument,
通過在內(nèi)部的CMakeLists.txt中添加如下語句消除warning。

set(CMAKE_CXX_FLAGS "-Wno-unused-command-line-argument")

image.png

  • 注意:.c文件時是使用CMAKE_C_FLAGS,.cpp文件時是使用CMAKE_CXX_FLAGS

3、編譯結(jié)果如下:
生成可執(zhí)行文件和動態(tài)庫
image.png

4、要編譯靜態(tài)庫及其可執(zhí)行文件,內(nèi)部的CMakeLists.txt中添加如下語句

############################################################
# Create a library
#############################################################Generate the static library from the library sources
ADD_LIBRARY(hello_static_library STATIC Hello.cpp)TARGET_INCLUDE_DIRECTORIES(hello_static_libraryPUBLIC ${PROJECT_SOURCE_DIR}/include)############################################################
# Create an executable
############################################################# Add an executable with the above sources
ADD_EXECUTABLE(hello_static_binary main.cpp)# link the new hello_library target with the hello_binary target
TARGET_LINK_LIBRARIES( hello_static_binaryPRIVATE hello_static_library)	

編譯結(jié)果如下,生成靜態(tài)庫及其可執(zhí)行文件
image.png

5、編譯64位的庫文件和可執(zhí)行文件,OHOS_ARCH參數(shù)選擇arm64-v8a或者編譯時不傳遞該參數(shù)。

3.4.5 使用CMake進(jìn)行構(gòu)建,選擇ninja生成器并生成編譯流程圖

1、執(zhí)行cmake -G查看linux環(huán)境下的生成器,ndk中自帶的生成器是Ninja。

image.png

2、使用CMake進(jìn)行構(gòu)建時添加上-G “Ninja”

image.png

第一步:mkdir build && cd build第二步:cmake -G "Ninja" -D OHOS_STL=c++_shared -D OHOS_ARCH=armeabi-v7a -D OHOS_PLATFORM=OHOS -D CMAKE_TOOLCHAIN_FILE=/xxx/build/cmake/ohos.toolchain.cmake ..第三步:cmake --build .或者ninja -f build.ninja

執(zhí)行完第二步后,build目錄下會生成build.ninja,有了build.ninja可以使用ninja生成程序的編譯流程圖。

3、使用ninja工具生成庫文件和可執(zhí)行文件的編譯流程圖。

# 將libhello_shared_library.so動態(tài)庫的編譯流程轉(zhuǎn)為dot
ninja -t graph libhello_shared_library.so > xxx.dot# 將dot格式轉(zhuǎn)化為png格式的流程圖
dot -T png xxx.dot -o libhello_shared_library.so.png
# 將dot格式轉(zhuǎn)化為svg格式的流程圖
dot -T svg xxx.dot -o libhello_shared_library.so.svg

xxx.png
如果生成圖片格式太小的話,可以生成svg格式到瀏覽器打開,這一點很重要,請參考該 issue

3.4.6 使用NDK中的cmake-gui進(jìn)行圖形化操作編譯

1、native/build-tools/cmake/bin目錄有cmake-gui,可以用它圖形化傳入編譯參數(shù)進(jìn)行編譯。
image.png

2、首先點擊Where is source code行的Browser Source,加載工程所在目錄。
再點擊Where to build the binarys行的Browser Source,加載點擊“Where is source code”行的Browser Source,加載源碼所在目錄。
點擊“Where to build the binarys行的Browser Source,加載工程所在目錄下的build目錄(沒有就創(chuàng)建一個)。

3、點擊Add Entry傳入cmake 參數(shù)。勾選把旁邊的Grouped選項。
9825d68023da3b2f4c3881c0b19a4e4.jpg

4、點擊Configure選擇Current Generator生成器為Unix Makefiles。

5、最后打開Where to build the binarys加載構(gòu)建目錄終端,執(zhí)行make -j 8命令

make -j n含義是 讓make最多允許n個編譯命令同時執(zhí)行,這樣可以更有效的利用CPU資源。假設(shè)系統(tǒng)cpu是12核,在不影響其他工作的情況下,我們可以make -j 12將cpu資源充分利用起來,一般來說,最大并行任務(wù)數(shù)為cpu_num * 2。

image.png


寫文章提的issue https://gitee.com/openharmony/third_party_musl/issues/I6JRBU?from=project-issue

http://www.risenshineclean.com/news/1911.html

相關(guān)文章:

  • 百度做網(wǎng)站找誰智能建站系統(tǒng)
  • 煙臺優(yōu)化網(wǎng)站建設(shè)網(wǎng)絡(luò)營銷好不好
  • 前端做視頻直播網(wǎng)站怎么做線上推廣
  • vs中可以用新建項目來做網(wǎng)站嗎如何快速推廣自己的產(chǎn)品
  • 網(wǎng)站開發(fā)php廣州網(wǎng)站seo公司
  • 個人網(wǎng)站備案可以做項目網(wǎng)站關(guān)鍵詞排名優(yōu)化易下拉排名
  • 自定義網(wǎng)站建站公司seo提升排名
  • 關(guān)于政府網(wǎng)站建設(shè)的調(diào)研報告百度關(guān)鍵詞查詢排名
  • html網(wǎng)頁模板網(wǎng)站模板下載廈門網(wǎng)站建設(shè)平臺
  • 深圳自適應(yīng)網(wǎng)站建設(shè)價格網(wǎng)絡(luò)推廣外包一年多少錢
  • 攝影網(wǎng)站開發(fā)的背景企業(yè)網(wǎng)站建設(shè)哪家好
  • 做網(wǎng)站域名的成本廣州網(wǎng)站建設(shè)公司
  • 音樂做音基題網(wǎng)站seo外鏈推廣工具
  • 免費網(wǎng)站空間可訪問第三方推廣平臺
  • 政府網(wǎng)站建設(shè)項目背景seo網(wǎng)站優(yōu)化推薦
  • 做網(wǎng)站工作室找客戶難廣州谷歌優(yōu)化
  • 裝修公司做網(wǎng)站有用嗎友情鏈接的網(wǎng)站圖片
  • 自助建站系統(tǒng)微信管理系統(tǒng)登錄入口
  • 做技術(shù)開發(fā)的網(wǎng)站如何制作一個網(wǎng)站
  • 南陽網(wǎng)站排名優(yōu)化濟(jì)南做網(wǎng)站比較好的公司
  • 杭州網(wǎng)站建設(shè)網(wǎng)百度瀏覽器網(wǎng)址鏈接
  • 網(wǎng)站推廣的措施和手段有哪些新塘網(wǎng)站seo優(yōu)化
  • 動易官方網(wǎng)站搜索引擎優(yōu)化實訓(xùn)
  • 可以做設(shè)計的網(wǎng)站社交媒體營銷案例
  • wordpress產(chǎn)品的分類標(biāo)簽屬性區(qū)別信息流優(yōu)化師培訓(xùn)機構(gòu)
  • 網(wǎng)站設(shè)計審美角度怎么去推廣一個app
  • 甘肅省住房和城鄉(xiāng)建設(shè)廳注冊中心網(wǎng)站首頁交換鏈接適用于哪些網(wǎng)站
  • 湖南網(wǎng)站建設(shè)小公司排名廣州網(wǎng)站優(yōu)化外包
  • 石家莊企業(yè)網(wǎng)站制作上海網(wǎng)絡(luò)推廣優(yōu)化公司
  • 成都網(wǎng)站建設(shè)小程序360關(guān)鍵詞指數(shù)查詢