一、NDK 版本

当前 NDK 版本oh-uni-package.json

ohos-sdk-windows-linux-public

{
  "apiVersion": "23",
  "displayName": "Native",
  "meta": {
    "metaVersion": "3.0.0"
  },
  "path": "native",
  "releaseType": "Release",
  "version": "6.1.0.35"
}

ABI 兼容规则表compatible_config.json

{
    "native_ABI": {
      "ABI_1": {
        "clang_version": 10,
        "start_api_level": 7,
        "end_api_level": 8
      },
      "ABI_2": {
        "clang_version": 12,
        "start_api_level": 9,
        "end_api_level": 9
      },
      "ABI_3": {
        "clang_version": 15,
        "start_api_level": 10,
        "end_api_level": 9999
      }
    }
}


NDK 库ndk_system_capability.json

这是 NDK 内部映射表:key 是 NDK 库名(so 名称),value 是这个库依赖的 SystemCapability(SysCap,系统能力标识)
构建工具链、hap 打包、应用市场分发校验、canIUse 能力判断,都会读取这个文件

{
  "EGL": "SystemCapability.Graphic.Graphic2D.EGL",
  "GLESv2": "SystemCapability.Graphic.Graphic2D.GLES2",
  "GLESv3": "SystemCapability.Graphic.Graphic2D.GLES3",
  "GLv4": "SystemCapability.Graphic.Graphic2D.GL4",
  "OpenSLES": "SystemCapability.Multimedia.Audio.Core",
  "ability_access_control": "SystemCapability.Security.AccessToken",
  "ability_base_want": "SystemCapability.Ability.AbilityBase",
  "ability_runtime": "SystemCapability.Ability.AbilityRuntime.Core",
  "ace_napi": "SystemCapability.ArkUI.ArkUI.Napi",
  "ace_ndk": "SystemCapability.ArkUI.ArkUI.Full",
  "asset_ndk": "SystemCapability.Security.Asset",
  "avimage_generator": "SystemCapability.Multimedia.Media.AVImageGenerator",
  "avmedia_base": "SystemCapability.Multimedia.Media.Core",
  "avmedia_source": "SystemCapability.Multimedia.Media.Core",
  "avmetadata_extractor": "SystemCapability.Multimedia.Media.AVMetadataExtractor",
  "avplayer": "SystemCapability.Multimedia.Media.AVPlayer",
  "avrecorder": "SystemCapability.Multimedia.Media.AVRecorder",
  "avtranscoder": "SystemCapability.Multimedia.Media.AVTranscoder",
  "background_process_manager": "SystemCapability.Resourceschedule.BackgroundProcessManager",
  "bluetooth_ndk": "SystemCapability.Communication.Bluetooth.Core",
  "bundle_ndk": "SystemCapability.BundleManager.BundleFramework.Core",
  "child_process": "SystemCapability.Ability.AbilityRuntime.Core",
  "ddk_base": "SystemCapability.Driver.DDK.Extension",
  "deviceinfo_ndk": "SystemCapability.Startup.SystemInfo",
  "devicemanager_ndk": "SystemCapability.DistributedHardware.DeviceManager",
  "ffrt": "SystemCapability.Resourceschedule.Ffrt.Core",
  "hiappevent_ndk": "SystemCapability.HiviewDFX.HiAppEvent",
  "hid": "SystemCapability.Driver.HID.Extension",
  "hilog_ndk": "SystemCapability.HiviewDFX.HiLog",
  "hitrace_ndk": "SystemCapability.HiviewDFX.HiTrace",
  "huks_external_crypto": "SystemCapability.Security.Huks.CryptoExtension",
  "huks_ndk": "SystemCapability.Security.Huks.Core",
  "icu": "SystemCapability.Global.I18n",
  "image_common": "SystemCapability.Multimedia.Image.Core",
  "image_effect": "SystemCapability.Multimedia.ImageEffect.Core",
  "image_ndk": "SystemCapability.Multimedia.Image.Core",
  "image_packer": "SystemCapability.Multimedia.Image.ImagePacker",
  "image_packer_ndk": "SystemCapability.Multimedia.Image.Core",
  "image_processing": "SystemCapability.Multimedia.VideoProcessingEngine",
  "image_receiver": "SystemCapability.Multimedia.Image.ImageReceiver",
  "image_receiver_ndk": "SystemCapability.Multimedia.Image.Core",
  "image_source": "SystemCapability.Multimedia.Image.ImageSource",
  "image_source_ndk": "SystemCapability.Multimedia.Image.Core",
  "ipc_capi": "SystemCapability.Communication.IPC.Core",
  "jsvm": "SystemCapability.ArkCompiler.JSVM",
  "location_ndk": "SystemCapability.Location.Location.Core",
  "lowpower_avsink": "SystemCapability.Multimedia.Media.LowPowerAVSink",
  "media_asset_manager": "SystemCapability.FileManagement.PhotoAccessHelper.Core",
  "mindspore_lite_ndk": "SystemCapability.Ai.MindSpore",
  "native_avscreen_capture": "SystemCapability.Multimedia.Media.AVScreenCapture",
  "native_buffer": "SystemCapability.Graphic.Graphic2D.NativeBuffer",
  "native_color_space_manager": "SystemCapability.Graphic.Graphic2D.ColorManager.Core",
  "native_display_manager": "SystemCapability.WindowManager.WindowManager.Core",
  "native_display_soloist": "SystemCapability.Graphic.Graphic2D.HyperGraphicManager",
  "native_drawing": "SystemCapability.Graphic.Graphic2D.NativeDrawing",
  "native_drm": "SystemCapability.Multimedia.Drm.Core",
  "native_effect": "SystemCapability.Multimedia.Image.Core",
  "native_fence": "SystemCapability.Graphic.Graphic2D.NativeWindow",
  "native_image": "SystemCapability.Graphic.Graphic2D.NativeImage",
  "native_media_acodec": "SystemCapability.Multimedia.Media.AudioCodec",
  "native_media_adec": "SystemCapability.Multimedia.Media.AudioDecoder",
  "native_media_aenc": "SystemCapability.Multimedia.Media.AudioEncoder",
  "native_media_avcencinfo": "SystemCapability.Multimedia.Media.Spliter",
  "native_media_avdemuxer": "SystemCapability.Multimedia.Media.Spliter",
  "native_media_avmuxer": "SystemCapability.Multimedia.Media.Muxer",
  "native_media_avsource": "SystemCapability.Multimedia.Media.Spliter",
  "native_media_codecbase": "SystemCapability.Multimedia.Media.CodecBase",
  "native_media_core": "SystemCapability.Multimedia.Media.Core",
  "native_media_vdec": "SystemCapability.Multimedia.Media.VideoDecoder",
  "native_media_venc": "SystemCapability.Multimedia.Media.VideoEncoder",
  "native_rdb_ndk": "SystemCapability.DistributedDataManager.RelationalStore.Core",
  "native_vsync": "SystemCapability.Graphic.Graphic2D.NativeVsync",
  "native_window": "SystemCapability.Graphic.Graphic2D.NativeWindow",
  "native_window_manager": "SystemCapability.Window.SessionManager",
  "net_connection": "SystemCapability.Communication.NetManager.Core",
  "net_http": "SystemCapability.Communication.NetStack",
  "net_ssl": "SystemCapability.Communication.NetStack",
  "net_websocket": "SystemCapability.Communication.NetStack",
  "neural_network_core": "SystemCapability.AI.NeuralNetworkRuntime",
  "neural_network_runtime": "SystemCapability.AI.NeuralNetworkRuntime",
  "ohaudio": "SystemCapability.Multimedia.Audio.Core",
  "ohaudiosuite": "SystemCapability.Multimedia.Audio.SuiteEngine",
  "ohavsession": "SystemCapability.Multimedia.AVSession.Core",
  "ohbattery_info": "SystemCapability.PowerManager.BatteryManager.Core",
  "ohcamera": "SystemCapability.Multimedia.Camera.Core",
  "ohcert_manager": "SystemCapability.Security.CertificateManager",
  "ohclouddiskmanager": "SystemCapability.FileManagement.CloudDiskManager",
  "ohcommonevent": "SystemCapability.Notification.CommonEvent",
  "ohcrypto": "SystemCapability.Security.CryptoFramework",
  "ohdlp_permission": "SystemCapability.Security.DataLossPrevention",
  "ohenvironment": "SystemCapability.FileManagement.File.Environment.FolderObtain",
  "ohfileio": "SystemCapability.FileManagement.File.FileIO",
  "ohfileshare": "SystemCapability.FileManagement.AppFileService.FolderAuthorization",
  "ohfileuri": "SystemCapability.FileManagement.AppFileService",
  "ohgame_controller": "SystemCapability.Game.GameController",
  "ohhicollie": "SystemCapability.HiviewDFX.HiCollie",
  "ohhidebug": "SystemCapability.HiviewDFX.HiProfiler.HiDebug",
  "ohi18n": "SystemCapability.Global.I18n",
  "ohimage": "SystemCapability.Multimedia.Image.Core",
  "ohinput": "SystemCapability.MultimodalInput.Input.Core",
  "ohinputmethod": "SystemCapability.MiscServices.InputMethodFramework",
  "ohnotification": "SystemCapability.Notification.Notification",
  "ohpreferences": "SystemCapability.DistributedDataManager.Preferences.Core",
  "ohprint": "SystemCapability.Print.PrintFramework",
  "ohresmgr": "SystemCapability.Global.ResourceManager",
  "ohscan": "SystemCapability.Print.PrintFramework",
  "ohsensor": "SystemCapability.Sensors.Sensor",
  "ohvibrator": "SystemCapability.Sensors.MiscDevice",
  "ohweb": "SystemCapability.Web.Webview.Core",
  "os_account_ndk": "SystemCapability.Account.OsAccount",
  "pasteboard": "SystemCapability.MiscServices.Pasteboard",
  "picture": "SystemCapability.Multimedia.Image.Core",
  "pixelmap": "SystemCapability.Multimedia.Image.Core",
  "pixelmap_ndk": "SystemCapability.Multimedia.Image.Core",
  "purgeable_memory_ndk": "SystemCapability.Kernel.Memory",
  "qos": "SystemCapability.Resourceschedule.QoS.Core",
  "rawfile": "SystemCapability.Global.ResourceManager",
  "scsi": "SystemCapability.Driver.SCSI.Extension",
  "teec": "SystemCapability.Tee.TeeClient",
  "telephony_data": "SystemCapability.Telephony.CellularData",
  "telephony_radio": "SystemCapability.Telephony.CoreService",
  "time_service_ndk": "SystemCapability.MiscServices.Time",
  "transient_task": "SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask",
  "udmf": "SystemCapability.DistributedDataManager.UDMF.Core",
  "usb_ndk": "SystemCapability.Driver.USB.Extension",
  "usb_serial_ndk": "SystemCapability.Driver.UsbSerial.Extension",
  "video_processing": "SystemCapability.Multimedia.VideoProcessingEngine",
  "vulkan": "SystemCapability.Graphic.Vulkan",
  "wifi_ndk": "SystemCapability.Communication.WiFi.STA"
}

二、构建流程

构建命令与打印日志如下:
在这里插入图片描述

  • -D OHOS_ARCH指定架构,图中指定编译目标为 32 位 ARM ABI
  • -D OHOS_PLATFORM指定目标平台,图中指定 OpenHarmony 目标平台配置
  • -D CMAKE_TOOLCHAIN_FILE指定交叉编译工具链配置文件,ohos.toolchain.cmake提供Clang、Sysroot等交叉编译配置

ohos.toolchain.cmake部分内容如下:
1.定位 OpenHarmony SDK 根目录
在这里插入图片描述
2.目标架构选择

 60 # set the ABI
 61 if(NOT DEFINED OHOS_ARCH)
 62   set(OHOS_ARCH arm64-v8a)
 63 endif()
 64
 65 # set the undefined symbols
 66 if(DEFINED OHOS_NO_UNDEFINED)
 67   if(NOT DEFINED OHOS_ALLOW_UNDEFINED_SYMBOLS)
 68     set(OHOS_ALLOW_UNDEFINED_SYMBOLS "${OHOS_NO_UNDEFINED}")
 69   endif()
 70 endif()
 71
 72 # set the ccache
 73 if(DEFINED SDK_NATIVE_CCACHE AND NOT DEFINED OHOS_CCACHE)
 74   set(OHOS_CCACHE "${SDK_NATIVE_CCACHE}")
 75 endif()
 76
 77 # set the sdk native platform
 78 include(${CMAKE_CURRENT_LIST_DIR}/sdk_native_platforms.cmake)
 79 if(NOT DEFINED OHOS_SDK_NATIVE_PLATFORM)
 80   set(OHOS_SDK_NATIVE_PLATFORM "ohos-${SDK_NATIVE_MIN_PLATFORM_LEVEL}")
 81 endif()
 82
 83 # set the sdk native platform level
 84 string(REPLACE "ohos-" "" OHOS_SDK_NATIVE_PLATFORM_LEVEL ${OHOS_SDK_NATIVE_PLATFORM})
 85
 86 # set find executable programs on the host system path
 87 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
 88 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
 89 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
 90 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
 91 list(APPEND CMAKE_FIND_ROOT_PATH "${OHOS_SDK_NATIVE}")
 92
 93 # set the arch abi
 94 set(CMAKE_OHOS_ARCH_ABI ${OHOS_ARCH})
 95
 96 # set arch diff property ...
 97 if(OHOS_ARCH STREQUAL arm64-v8a)
 98   set(OHOS_TOOLCHAIN_NAME aarch64-linux-ohos)
 99   set(OHOS_LLVM ${OHOS_TOOLCHAIN_NAME})
100   set(CMAKE_SYSTEM_PROCESSOR aarch64)
101 elseif(OHOS_ARCH STREQUAL armeabi-v7a)
102   set(OHOS_TOOLCHAIN_NAME arm-linux-ohos)
103   set(OHOS_LLVM ${OHOS_TOOLCHAIN_NAME})
104   set(CMAKE_SYSTEM_PROCESSOR arm)
105 elseif(OHOS_ARCH STREQUAL x86_64)
106   set(OHOS_TOOLCHAIN_NAME x86_64-linux-ohos)
107   set(OHOS_LLVM ${OHOS_TOOLCHAIN_NAME})
108   set(CMAKE_SYSTEM_PROCESSOR x86_64)
109 else()
110   message(FATAL_ERROR "unrecognized ${OHOS_ARCH}")
111 endif()

3.设置 Clang 的目标平台
在这里插入图片描述
4.配置 C 的编译参数
在这里插入图片描述
5.配置链接器及链接参数

234 # set the common link flags
235 set(OHOS_COMMON_LINKER_FLAGS)
236 list(APPEND OHOS_COMMON_LINKER_FLAGS --rtlib=compiler-rt)
237 list(APPEND OHOS_COMMON_LINKER_FLAGS -fuse-ld=lld)
238
239 if(OHOS_STL STREQUAL c++_static)
240   list(APPEND OHOS_COMMON_LINKER_FLAGS "-static-libstdc++")
241 elseif(OHOS_STL STREQUAL none)
242   list(APPEND OHOS_CXX_COMPILER_FLAGS "-nostdinc++")
243   list(APPEND OHOS_COMMON_LINKER_FLAGS "-nostdlib++")
244 elseif(OHOS_STL STREQUAL c++_shared)
245 else()
246   message(FATAL_ERROR "Unsupported STL configuration: ${OHOS_STL}.")
247 endif()
248
249 list(APPEND OHOS_COMMON_LINKER_FLAGS
250   -Wl,--build-id=sha1
251   -Wl,--warn-shared-textrel
252   -Wl,--fatal-warnings
253   -lunwind)
254 if(NOT OHOS_ALLOW_UNDEFINED_SYMBOLS)
255   list(APPEND OHOS_COMMON_LINKER_FLAGS -Wl,--no-undefined)
256 endif()
257 list(APPEND OHOS_COMMON_LINKER_FLAGS -Qunused-arguments -Wl,-z,noexecstack)
258 string(REPLACE ";" " " OHOS_COMMON_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS}")
259
260 # set the executable link flags
261 set(OHOS_EXE_LINKER_FLAGS)
262 list(APPEND OHOS_EXE_LINKER_FLAGS -Wl,--gc-sections)
263 string(REPLACE ";" " " OHOS_EXE_LINKER_FLAGS "${OHOS_EXE_LINKER_FLAGS}")



300 # set the link flags
301 set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create shared libraries.")
302 set(CMAKE_SHARED_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
303
304 set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create modules.")
305 set(CMAKE_MODULE_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
306
307 set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "Linker flags to be used to create executables.")
308 set(CMAKE_EXE_LINKER_FLAGS "${OHOS_COMMON_LINKER_FLAGS} ${OHOS_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_    FLAGS}")

6.指定 Sysroot、Clang、llvm-ar 等工具
在这里插入图片描述

三、编译流程

在这里插入图片描述
/lib/ld-musl-arm.so.1 就是可执行文件运行时,操作系统寻找动态链接器的路径

参数作用
–sysroot=…/sysroot指定目标系统资源根目录
-pie生成位置无关可执行文件
-m armelf_linux_eabi指定 ARM ELF 链接目标格式
–dynamic-linker /lib/ld-musl-arm.so.1指定程序运行时使用的动态链接器路径
-o Tcp_Client指定最终输出文件
client.c.o链接你的程序目标文件
-lm链接数学库
-lc链接 C 标准库

Sysroot 和 Clang Runtime 都在这里发挥作用

使用下面命令查看程序实际依赖哪些动态库

llvm-readelf -d src/Tcp_Client

看NEEDED字段
在这里插入图片描述

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐