Uni-app 原生IOS插件本地使用打包错误Undefined symbols for architecture arm64:\“_OBJC_CLASS_$_FIRApp\“, reference

项目是根据Cocoapods初始化创建的,开发阶段和xcode调试阶段都是正常的,但将打包后的插件放到uni-app项目的nativeplugins处,引用本地插件报错,报错信息如下:

ld: warning: -ld64 is deprecated, use -ld_classic instead
ld: warning: arm64 function not 4-byte aligned: _dc_ffi_call_SYSV from [SourcePath]/libs/UniSDK/liblibPGInvocation.a(sysv_arm64.o)
ld: warning: arm64 function not 4-byte aligned: _ffi_closure_SYSV from [SourcePath]/libs/UniSDK/liblibPGInvocation.a(sysv_arm64.o)
ld: warning: Could not find or use auto-linked framework 'FirebaseCore'
ld: warning: Could not find or use auto-linked framework 'CoreAudioTypes'
ld: warning: Could not find or use auto-linked framework 'FirebaseMessaging'
Undefined symbols for architecture arm64:
\"_OBJC_CLASS_$_FIRApp\", referenced from:
objc-class-ref in sunways_mnmodule(SwUniPluginProxy.o)
\"_OBJC_CLASS_$_FIRMessaging\", referenced from:
objc-class-ref in sunways_mnmodule(SwUniPluginProxy.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

从官网和网上找了很多方法,如下解决办法:

1. iOS Undefined ..Arm64问题解决-优快云博客

2. iOS Undefined symbols for architecture armv7 _OBJC_CLASS_$_**", referenced from:

上面提到的问题中,能调试的都调试后,发现都不能解决我的问题

后来查看官网原生插件案例,发现插件的package.json配置有问题。

列举下package.json的配置项说明

{
	"name": "插件名称",
	"id": "插件标识,需要保证唯一性",
	"version": "插件版本号",
	"description": "插件描述信息",
	"_dp_type":"nativeplugin",
	"_dp_nativeplugin":{
		"android": {
			"plugins": [
				{
					"type": "module|component, 必填, 根据插件类型选择",
					"name": "必填, 注册插件的名称, 注意:module 的 name 必须以插件id为前缀或和插件id相同,比如 `DCTestUniPlugin-TestModule`,其中 DCTestUniPlugin 为插件的id,避免与其他插件冲突,component 的 name 没有强制要求,但是也要保证唯一比如 `dc-map`",
					"class": "必填, 注册插件的类名"
				}
			],
			"hooksClass": "可选, 事件钩子注册类名",
			"integrateType": "必填, 可取值aar|jar",
			"dependencies": [
				"可选, 依赖的库名称"
			],
			"excludeDependencies": [
				"可选,需要排除的HX内置模块依赖库名称"  //HBuilderX3.1.18+支持:仅在插件与HX内置模块依赖库存在冲突时可能需要,使用前请在官方QQ交流群“DCloud原生开发者群”中联系管理员确认
			],
			"compileOptions": {  //可选,Java编译参数配置
				"sourceCompatibility": "1.8",
				"targetCompatibility": "1.8"
			},
			"abis": [
				"可选, 支持的abi类型, 可取值armeabi-v7a|arm64-v8a|x86"
			],
			"minSdkVersion": "可选,支持的Android最低版本,如21",
			"useAndroidX": false,   //可选,是否兼容使用AndroidX  3.2.5+版本后废弃该属性
			"permissions": [
				"可选, 要使用的Android权限列表"
			],
			"parameters": {
				"插件需要配置的参数名称, 如appid": {
					"des": "参数描述",
					"key": "AndroidManifest.xml中添加meta-data节点!对应android:name属性值, 如GETUI_APPID",
					"placeholder": "build.gradle中添加到manifestPlaceholders中的字段名"
				}
			}
		},
		"ios": {
			"plugins": [
				{
					"type": "必填, module|component, 根据插件类型选择",
					"name": "必填, 注册插件的名称, 通常与插件标识一致",
					"class": "必填, 注册插件的类名" 
				}
			],
			"integrateType": "必填, 可取值framework|library",
			"hooksClass": "可选, 事件钩子注册类名",
			"frameworks": [
				"依赖的系统库(系统库有.framework和.tbd和.dylib类型),和第三方.framework动态库;(.a 库或 .framework**静态库**直接放到ios根目录即可,不需要配置)"
			],
			"embedFrameworks": [
				"依赖的.framework动态库(注意.framework动态库也需要在上面的 frameworks 节点添加配置,同样将动态库.framework文件放到 ios 目录)"
			],
			"capabilities": {    // 配置应用的capabilities数据(根据XCode规范分别配置到entitlements和plist文件中)
				"entitlements": {    // 合并到工程entitlements文件的数据(json格式)
				},
				"plists": {    // 合并到工程Info.plist文件的数据(json格式)
				}
			},
			"plists": {    // 自定义配置工程Info.plist文件的数据(json格式),优先级高于capabilities->plists
			},
			"assets": [    //HBuilderX2.3.4及以上版本支持
			 	"可选,插件要使用的xcassets文件列表,相对于ios目录的路径"
			],
			"privacies": [
				"可选, 插件使用到的隐私列表,如NSPhotoLibraryUsageDescription"
			],
			"embedSwift": false,   // 开启 swift 编译支持,如果插件使用了 swift 需要配置此项
			"deploymentTarget": "8.0, 可选,注意:使用 Xcode14 需配置为 "11.0"
			"validArchitectures": [    // 可选,支持的CPU架构类型
			 	"arm64"    // 支持多个值,可取值:"arm64", "armv7",注意:使用 Xcode14 需要配置为 “arm64” 
			],
			"parameters": {
				"插件需要配置的参数名称, 如appid": {
					"des": "参数描述信息",
					"key": "参数需要配置到info.plist中的键名, 嵌套时使用:分割,如getui:appid"
				}
			},
			"resources": [
				"可选, 插件要使用的资源文件列表,相对于ios目录的路径 ,HX 3.2.0+ 版本不在推荐使用,请参考文档下面的 “依赖资源文件” 说明"
			]
		}
	}
}

如果插件本身的framework是动态库或者第三方依赖库是动态库(framework中有Headers和Modules等就属于动态库),那么就需要手动在ios文件夹中添加,并在package.json中的embedFrameworks中配置上;资源文件(添加在插件工程项目中的资源文件,这里就是GoogleService-Info.plist文件)需要再添加在resources 中。

故而修改我的package.json文件如下

{
  "name": "message",
  "id": "sunways-mnmodule",
  "version": "0.1.0",
  "description": "message",
  "_dp_type":"nativeplugin",
  "_dp_nativeplugin":{
    "ios": {
      "plugins": [
        {
          "type": "module",
          "name": "sunways-mnmodule",
          "class": "SwUniTestModule"
        }
      ],
      "integrateType": "library",
      "hooksClass": "SwUniPluginProxy",
      "deploymentTarget": "12.0",
      "embedFrameworks": [
        "FirebaseAuth.framework",
        "FirebaseCore.framework",
        "FirebaseCoreInternal.framework",
        "FirebaseInstallations.framework",
        "FirebaseMessaging.framework",
        "GTMSessionFetcher.framework",
        "GoogleDataTransport.framework",
        "GoogleUtilities.framework",
        "FBLPromises.framework",
        "RecaptchaInterop.framework",
        "nanopb.framework",
        "AlipaySDK.framework",
        "GTSDK.framework",
        "FirebaseAppCheckInterop.framework",
        "sunways_mnmodule.framework"
      ],
      "resources": [
        "GoogleService-Info.plist"
	  ]
    }
  }
}

本地插件文件结构如下:

### 回答1: 这是一个错误提示,表示在编译 Mac 应用程序时遇到了编译器找不到符号的问题,其中涉及到了 ARM64 架构。这通常是由于代码中使用了未定义的函数或变量,或者是链接器无法找到正确的库文件导致的。需要进一步检查代码,并确保库文件和符号都正确定义和链接。 ### 回答2: macOS是苹果公司的操作系统,不同于Windows和Linux,它专门为苹果公司的设备设计。在macOS中,开发人员们经常会遇到各种各样的编译错误和异常。这些错误很少是显而易见的,尤其是当你在编译器输出信息中看到了 “undefined symbols for architecture arm64” 时,你可能会感到很疑惑。让我们来深入了解一下这一异常信息的原因。 首先,我们需要理解什么是符号。符号在计算机科学中有着广泛的应用,它们是程序编译时被创建的一种元素,代表着函数、变量、类及其他定义,程序链接器将符号与实际的机器代码关联起来。在macOS中,arm64代表64位的ARM体系结构。在使用Xcode编译iOS或macOS应用程序时,错误信息中的 “undefined symbols for architecture arm64” 表示编译器打开了一个与设备CPU架构不兼容的库或文件,因此编译器无法正确识别它们。 为了解决这种问题,我们可以采取以下方法: 1. 更新库和文件 首先我们需要检查本地环境中使用到的库和文件是否都是与我们所使用的CPU架构兼容的版本。如果不兼容,则需要更新库和文件,确保它们能与你的CPU架构兼容。 2. 检查编译器选项 在使用编译器时,需要设置正确的选项来确保执行正确的CPU架构。我们需要检查编译器选项,确保目标CPU架构与所选选项一致。 3. 更新Xcode 如果上述两种方法都没有解决问题,那么我们可以考虑更新Xcode,确保它与我们所使用的CPU架构兼容。 总而言之,当你在编译器输出信息中看到了 “undefined symbols for architecture arm64” 时,它可能是由不兼容的库或文件引起的。我们需要更新库和文件、检查编译器选项以及更新Xcode以确保它们能够与我们所使用的CPU架构兼容。 ### 回答3: "mac undefined symbols for architecture arm64"错误通常指出了arm64的框架中存在未定义的符号。这通常会发生在编译或链接程序时,因为在架构中无法找到符号。 这个错误的最简单的解决方案是添加缺失的库或框架,或者确保正确地加载了库或框架。使用Xcode的话,在“Build Phases”的“Link Binary with Libraries”中添加必要的库或框架即可。 此外,这种错误也可能是由于优化标志设置不正确导致的。在Xcode的“Build Settings”中,您可以找到“Optimization Level”并尝试将其设置为“None”。 如果以上方法都不能解决问题,那么建议您观察错误行中指向未定义符号的位置,并查看相应的代码(通常是代码中缺少头文件或声明)。找到问题所在后,您可以将相应的库、框架或头文件添加到项目中。 最后,如果您不确定该怎么解决这个错误,请搜索相关的标识符和错误信息,以获取更多可能有用的信息。还可以向开发者社区寻求帮助,以获取更专业的建议和解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值