怎么修改第三方静态库支持的架构?没有源码

发布于 2022-09-05 04:09:49 字数 3893 浏览 22 评论 0

我想把已写好的项目文件放到cocoapods上供他人使用,我的项目文件包含一个由第三方开发的静态库,libEZOpenSDK.a,这个静态库只支持真机架构,不支持模拟器架构,所以在进行pod lib lint 进行本地验证的时候会出现错误:

Undefined symbols for architecture i386:
"_OBJC_CLASS_$_EZDeviceInfo", referenced from:

  objc-class-ref in Camera_TZYOPHomePageViewController.o   "_OBJC_CLASS_$_EZOpenSDK", referenced from:
  objc-class-ref in Camera_TZYHistoryRecordViewController.o
  objc-class-ref in Camera_TZYOPFunctionsSDK.o
  objc-class-ref in Camera_TZYOPHomePageViewController.o
  objc-class-ref in Camera_TZYSettingViewController.o ld: symbol(s) not found for architecture i386 clang: error: linker command

failed with exit code 1 (use -v to see invocation)

BUILD FAILED

The following build commands failed:

Ld /Users/yuancong/Library/Developer/Xcode/DerivedData/App-fmvnjejbnyymigeawgsdeaxjbfki/Build/Intermediates/Pods.build/Release-iphonesimulator/Cameara_TZYEZFunctions.build/Objects-normal/x86_64/Cameara_TZYEZFunctions

normal x86_64

Ld /Users/yuancong/Library/Developer/Xcode/DerivedData/App-fmvnjejbnyymigeawgsdeaxjbfki/Build/Intermediates/Pods.build/Release-iphonesimulator/Cameara_TZYEZFunctions.build/Objects-normal/i386/Cameara_TZYEZFunctions

normal i386 (2 failures)

所以我想问,有什么办法可以通过这个验证吗?比如,我是否需要在对应的podspec文件里面设置什么?或者有什么办法可以修改这个静态库支持的架构?

注意:我没有这个静态库的源码

最好是有什么方法可以修改静态库支持的架构,求大神解答,谢谢。

通过lipo -info 查看的静态库的信息:

yuancongdeiMac:~ yuancong$ lipo -info
/Users/yuancong/Desktop/iOS_v4.4.0.build20170320/SDK/libEZOpenSDK.a
Architectures in the fat file:
/Users/yuancong/Desktop/iOS_v4.4.0.build20170320/SDK/libEZOpenSDK.a
are: armv7 arm64 yuancongdeiMac:~ yuancong$

下面是我的podspec文件里的配置:

Pod::Spec.new do |s| s.name = 'Cameara_TZYEZFunctions'
s.version = '0.1.0' s.summary =
'Cameara_TZYEZFunctions.'

s.description = <<-DESC

                    Cameara_TZYEZFunctions podspec.
                   DESC

s.homepage =
'https://github.com/tencheer20...'

s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'tencheer2017' => 'stevenzhu@tencheer.com.cn' }
s.source = { :git =>
'https://github.com/tencheer20...', :tag =>
s.version.to_s }

s.ios.deployment_target = '8.0'

s.source_files =
'Cameara_TZYEZFunctions/Classes/*/','Cameara_TZYEZFunctions/sdk/openssl/include/openssl/.h','Cameara_TZYEZFunctions/sdk/SDK/include/TestLib/.h'

s.resources =
['Cameara_TZYEZFunctions/Camera_TZYResources/images//.png','Cameara_TZYEZFunctions/Camera_TZYResources/xib/.xib','Cameara_TZYEZFunctions/Camera_TZYResources/storyboard/.storyboard','Cameara_TZYEZFunctions/Camera_TZYResources/other//.strings']

s.public_header_files =
'Cameara_TZYEZFunctions/Classes/*/.h','Cameara_TZYEZFunctions/sdk/openssl/include/openssl/.h','Cameara_TZYEZFunctions/sdk/SDK/include/TestLib/.h'
s.frameworks = 'CoreMedia',
'AudioToolbox','VideoToolbox','GLKit','OpenAL','MobileCoreServices','SystemConfiguration','CoreTelephony','AVFoundation'
s.libraries = 'stdc++.6.0.9', 'c++','iconv.2.4.0'
s.vendored_libraries =
'Cameara_TZYEZFunctions/sdk/SDK/libEZOpenSDK.a','Cameara_TZYEZFunctions/sdk/openssl/lib/libssl.a','Cameara_TZYEZFunctions/sdk/openssl/lib/libcrypto.a'
s.dependency 'AFNetworking' s.dependency 'Toast' s.dependency
'ZASwitch' end

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

迎风吟唱 2022-09-12 04:09:49

我前几天集成支付宝SDK的帮助类的时候,遇到了集成 .a 文件的问题,不知道是不是楼主遇到的情况。写下我遇到的情况,希望能帮到你。

支付宝SDK官方没有iOS的github repo ,因此只能手动导入到工程里,还要解决各种依赖库。然后我就想要把它集成到 github 里。

然后主要有2个难点:

  1. 如何集成 SDK 里的 AlipaySDK.framework 到 CocoaPods 里

  2. 如何集成 .a 和 依赖它的 .h 文件到 CocoaPods 里。这里我也没拿到 .m 源码,只有 .a 和 .h 文件。

然后,google 和 stackoverflow ,再有就是 CocoaPods 里的 issue,最终把上面的问题解决了。先放一个我集成好的 AlipaySDK 帮助类 repo,链接在这.

针对问题1:

找了各种方法,最后发现无法集成到一个 repo 里。所以单独将 AlipaySDK.framework 和 AlipaySDK.bundle 抽取出来,放到一个 repo 里。这样,其他库想用的话,直接依赖这个 repo 就好了。

针对问题2:

首先,将 .a 和 .h 放到 subspec 里进行管理,然后主要用 vendored_libraries 索引.a文件,用libraries 标定这个子模块作为库使用。

其次,需要修改 Example 里 Podfile 的内容,在最后添加:

  pre_install do |installer|
    # workaround for https://github.com/CocoaPods/CocoaPods/issues/3289
    def installer.verify_no_static_framework_transitive_dependencies; end
end

解决target has transitive dependencies that include static binaries的问题

最后,在验证的时候要加上 pod lib lint --use_libraries 修饰,告诉 pods 这里用到了静态库。

至此,上面的问题被解决掉。

彻夜缠绵 2022-09-12 04:09:49

只回答第一个问题吧。。。你没有源码的话,你引用的第三方库是没办法修改成支持模拟器的,源码编译的时候,需要针对不同的architecture单独编译不同的库,最终合成一个.a文件,并不是修改某个值就可以的,具体的你可以搜一下“Mach-O File Format”这个官方文档,有具体的.a文件格式介绍

画▽骨i 2022-09-12 04:09:49

在podspec文件中添加支持的架构:

在这里选择你支持的架构

valid_archs = ['arm64',
                 'x86_64',]
s.xcconfig = {
  'VALID_ARCHS' =>  valid_archs.join(' '),
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文