building for iOS Simulator, but linking in object file built for iOS

本文解决了一个关于M1芯片环境下使用CocoaPods安装iOS第三方库时出现的iOS模拟器链接错误问题。通过修改Podfile及设置排除架构的方式解决了ld: building for iOS Simulator, but linking in object file built for iOS的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ld: building for iOS Simulator, but linking in object file built for iOS, file 'xxx/Pods/mob_sharesdk/ShareSDK/Support/PlatformConnector/QQConnector.framework/QQConnector' for architecture arm64

上篇文章讲了M1芯片安装CocoaPods问题,刚刚配置好pods环境。新的问题又出现了:运行项目时,编译不通过,模拟器报错,出现了上面的问题,而真机是可以运行的!Xcode版本12.4,模拟器是iOS14.4。而且在我电脑上(15款Macbook Pro)模拟器可以运行,真机也可以运行,新买的电脑M1芯片的运行却报错。
看了网上的内容,大致有几种方案都试了还是不行!

  1. 搜索VALID_ARCHS字段,将里面的值去掉或加上x86_64,或将整个字段删除。我搜索之后却没有个这值。
  2. 在Build Settings下Architecture中Excluded Architecture 属性加上 arm64,并且Build Active Architecture Only 设置为 NO。
  3. 删除.xcworkspace和Podfile.lock文件,重新pod install;删除Xcode缓存,点击访达Shift + command + G进入,输入~/Library/Developer/Xcode/DerivedData,删除里面的全部文件;多次重启Xcode。

在进行第二种方法的时候,出现以下错误

Cocoapods ld: library not found for -lPods-Projectname

解决方法(附件参考文章1)是在Build Phases下Link Binary With Libraries删除libPods-Projectname.a。然后出现缺少x86_64和i386,在arm64那加上这两个还是不可以,于是放弃了这种方法!
以上方法都试了,都不行!感觉是pods设置的问题,多次注掉Podfile文件里的库,然后执行pod install,还是报错!

然后找到了一篇文章(附件参考文章2)中的解决方法
  1. 在Excluded Architecture下增加 Any iOS Simulator SDK属性,值是arm64,并且Build Active Architecture Only 都设置为 YES(NO的话也运行不了)。

  2. Podfile或Podspec文件中设置

  • Podfile文件中增加代码:
post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end

然后执行pod install,执行后会自动在Podspec中添加上面的pod设置代码。

  • 在Podspec文件中添加pod设置代码:
s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

然后执行pod install

到这里模拟器就可以运行了,经测试真机也能正常运行。不像网上说的还要改回来真机才可以运行!
  • 但是在执行pod install的时候终端出现了以下警告:
[!] The `HaoYaoZaiXianB [Debug]` target overrides the `EXCLUDED_ARCHS[sdk=iphonesimulator*]` build setting defined in `Pods/Target Support Files/Pods-HaoYaoZaiXianB/Pods-HaoYaoZaiXianB.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The `HaoYaoZaiXianB [Release]` target overrides the `EXCLUDED_ARCHS[sdk=iphonesimulator*]` build setting defined in `Pods/Target Support Files/Pods-HaoYaoZaiXianB/Pods-HaoYaoZaiXianB.release.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

于是按照提示在Excluded Architecture下Debug和Release后面值增加$(inherited)。然后执行pod install就没有警告了!
我又按照文章里的其他方法试了,也不可以。最后pod环境都搞坏了,出现错误
failed to read asset tags: Error Domain=NSPOSIXErrorDomain Code=9 "Bad file
只能删掉.xcworkspace和Podfile.lock文件,重新pod install。果然重新恢复正常!

到这里就基本结束了,总结一下方法:
  1. Excluded Architecture中Debug和Release添加Any iOS Simulator SDK属性,添加值arm64并且设置Active Architecture都为YES
  2. Podfile文件添加设置,在指定source源后面(target前添加)添加
post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end
  1. Excluded Architecture中Debug和Release后面值增加$(inherited),去除pod install警告

原因在参考文章里有,因为是英文的(本人英文能力有限),具体原因我也是一知半解,只知道是M1芯片(与Intel芯片架构不同)才有这个问题!至于后续这样设置会出现其他问题吗,我也不清楚!但是项目却是可以正常运行的,而且真机调试的时候不用删除设置,省去了很多麻烦!

参考文章:

  1. stackoverflow参考文章1
  2. stackoverflow参考文章2
<think>我们有两个主要的引用来源:[1]和[3]是关于iOS平台下编译ZBar静态库的,[2]是关于在Linux环境下编译ZBar的。用户的问题是如何将zbar源代码编译为.a静态库文件,没有指定平台,但根据引用内容,我们可以分别提供iOS和Linux(或类Unix)平台下的编译方法。 ### 一、iOS平台编译ZBar静态库(引用[1]和[3]) 适用于Xcode项目,生成真机和模拟器通用的静态库。 #### 步骤: 1. **下载源码** 从GitHub下载ZBar源码: ```bash git clone https://github.com/ZBar/ZBar.git ``` 2. **打开Xcode项目** 进入下载的源码目录,找到`iphone`子目录下的`ZBar.xcodeproj`,用Xcode打开。 3. **配置项目架构** - 在Xcode中选中项目,进入`Build Settings`: - 设置`Architectures`为`Standard Architectures`(通常包含armv7, arm64等真机架构)。 - 设置`Build Active Architecture Only`为`NO`(确保编译所有架构)。 - 设置`iOS Deployment Target`为目标版本。 4. **编译真机版本** - 选择目标设备为`Generic iOS Device`(或连接真机)。 - 按`Command+B`编译,生成真机适用的静态库(位于`Products`目录下,如`Release-iphoneos/libzbar.a`)。 5. **编译模拟器版本** - 选择任意iOS模拟器(如iPhone 14 Simulator)。 - 再次按`Command+B`编译,生成模拟器适用的静态库(如`Release-iphonesimulator/libzbar.a`)。 6. **合并静态库** 使用`lipo`工具合并真机和模拟器库,生成通用静态库: ```bash lipo -create \ /path/to/Release-iphoneos/libzbar.a \ /path/to/Release-iphonesimulator/libzbar.a \ -output /path/to/merged/libzbar.a ``` 验证合并结果: ```bash lipo -info /path/to/merged/libzbar.a ``` 输出应包含`armv7`、`arm64`(真机)和`x86_64`、`i386`(模拟器)架构。 7. **使用静态库** 将合并后的`libzbar.a`和所有ZBar头文件(`.h`)添加到你的Xcode项目中。 > 注意:如果编译时遇到错误,可能需要调整源码适配新版本Xcode(如修复过时API)[^1][^3]。 ### 二、Linux/Unix平台编译ZBar静态库(引用[2]) 使用Autotools工具链生成纯静态库(`.a`文件)。 #### 步骤: 1. **下载源码** ```bash git clone https://github.com/ZBar/ZBar.git cd ZBar ``` 2. **配置编译选项** 运行`configure`脚本,禁用动态库并启用静态库: ```bash ./configure \ --disable-shared \ # 禁用动态库 --enable-static \ # 启用静态库 --disable-video \ # 可选:禁用视频功能 --without-gtk \ # 可选:禁用GTK --without-qt \ # 可选:禁用Qt --without-python # 可选:禁用Python绑定 ``` > 提示:添加`CFLAGS='-m32'`可编译32位版本,或`CFLAGS='-m64'`指定64位(默认)。 3. **编译并安装** ```bash make make install ``` 生成的静态库默认位于`/usr/local/lib/libzbar.a`。 4. **验证静态库** ```bash file /usr/local/lib/libzbar.a ``` 输出应为`current ar archive`(静态库文件)。 ### 三、手动编译(通用方法) 若需完全控制编译过程,可直接用`gcc`生成目标文件(`.o`)并打包为静态库: ```bash # 进入源码目录 cd zbar/ # 编译所有C文件为.o对象文件 gcc -c -I./include $(find . -name "*.c") # 打包为静态库 ar rcs libzbar.a *.o # 清理中间文件 rm *.o ``` ### 注意事项 1. **依赖项** ZBar依赖`libjpeg`、`libpng`等图像处理库,编译前需确保已安装(如Ubuntu:`sudo apt install libjpeg-dev libpng-dev`)[^4]。 2. **跨平台兼容性** iOS平台需合并多架构库,Linux/Unix平台通常只需单一架构[^1][^2]。 3. **错误处理** 若编译失败,检查`config.log`(Autotools)或Xcode构建日志,解决依赖或API兼容性问题。 §§相关问题§§ 1. 如何验证静态库(.a)包含的架构信息? 2. 在Linux下编译静态库时如何指定安装路径? 3. iOS静态库合并后为什么仍可能报“undefined symbol”错误? 4. 如何减少ZBar静态库的体积?</think>### 如何将 ZBar 源代码编译为 .a 静态库文件 以下是详细步骤,适用于 iOS 和 Linux 平台: --- #### 一、iOS 平台编译(Xcode 环境) 1. **下载源码** ```bash git clone https://github.com/ZBar/ZBar.git cd ZBar/iphone # 进入iOS项目目录 ``` 2. **配置项目架构** - 打开 `ZBar.xcodeproj` - 在 **Build Settings** 中: - 设置 `Architectures` 为 `Standard Architectures` (包含 armv7, arm64) - 设置 `Build Active Architecture Only` 为 `NO` ![Xcode架构设置](https://via.placeholder.com/400x200?text=Xcode架构配置示例)[^1] 3. **编译真机版本** - 选择目标设备为 **Generic iOS Device** - 按 `Command+B` 编译 - 生成的库文件位于: `Products/Debug-iphoneos/libzbar.a` 4. **编译模拟器版本** - 选择任意 iOS 模拟器(如 iPhone 14) - 再次按 `Command+B` 编译 - 生成的库文件位于: `Products/Debug-iphonesimulator/libzbar.a` 5. **合并静态库** 使用 `lipo` 合并真机和模拟器版本: ```bash lipo -create \ /path/to/Debug-iphoneos/libzbar.a \ /path/to/Debug-iphonesimulator/libzbar.a \ -output /path/to/merged/libzbar.a ``` 6. **验证合并结果** ```bash lipo -info libzbar.a ``` 输出应包含:`armv7 arm64 i386 x86_64`[^3] --- #### 二、Linux 平台编译 1. **安装依赖** ```bash sudo apt-get install autoconf automake libtool libjpeg-dev ``` 2. **配置编译选项** ```bash ./configure \ --disable-shared \ # 禁用动态库 --enable-static \ # 启用静态库 --disable-video \ # 可选:禁用视频支持 --without-imagemagick \ --without-gtk \ --prefix=$(pwd)/build ``` 3. **编译安装** ```bash make make install ``` 4. **获取静态库** 生成的静态库位于: `build/lib/libzbar.a` --- #### 三、使用静态库 1. **iOS 项目** - 将 `libzbar.a` 和头文件拖入 Xcode 项目 - 在 **Build Settings** 中添加: `Other Linker Flags = -lzbar -liconv -framework AVFoundation` 2. **Linux 项目** 编译时链接静态库: ```bash gcc your_app.c -I/path/to/zbar/headers -L/path/to/lib -lzbar -o app ``` --- ### 关键注意事项 1. **架构兼容性** iOS 需合并真机(arm)和模拟器(x86)版本,否则会报错: `Building for iOS Simulator, but linking in object file built for iOS` 2. **依赖处理** - Linux 需安装 `libjpeg-dev` 等依赖 - iOS 需额外链接 `iconv` 和 `AVFoundation` 3. **验证库内容** ```bash # 查看包含的符号 nm libzbar.a | grep zbar_image_scanner_create ``` > 通过以上步骤,您将获得可在真机和模拟器运行的通用静态库。合并后的库大小通常在 5-10MB 左右[^1][^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值