OpenHarmony Native应用交叉编译流程详解:CMake、Clang与链接过程
·
一、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字段

更多推荐

所有评论(0)