xcode编程之常见问题及解决办法

1: 头文件找不到

配置Target的”Build Settings -> Search Paths -> Header Search Paths” 中添加头文件的搜索路径

make-framework-problems_01

2: NSObjCRuntime的编译错误

NSObjCRuntime.h:400:1: Expected unqualified-id

NSObjCRuntime.h:402:19: Unknown type name ‘NSString’

这是因为项目中有c++的代码 需要修改编译配置 “Build Settings -> Apple LLVM 6.1 - language -> Compile Sources As” 修改成 “Objective-C++”

3: ARC相关的编译错误

‘release’ is unavailable: not available in automatic reference counting mode

这是因为项目中默认使用ARC方式编译 需要修改编译配置 “Build Settings -> Apple LLVM 6.1 - language - Objective C -> Objective-C Automatic Reference Counting” 修改成 “NO”

4: 预编译宏导致的编译错误

make-framework-problems_02

这里我们实际需要包含的头文件是”iPhoneClientConfig.h” 即添加”IPHONE_PLATFORM_BUILD”的编译宏

需要修改编译配置 “Build Settings -> Apple LLVM 6.1 - Preprocessing -> Preprecessor Macros” 添加 “IPHONE_PLATFORM_BUILD”

make-framework-problems_03

5: build成功了但framework bundle文件却没有生成

第一次编译framework工程时 请做如下设置 “Product -> Destination -> iOS Device” 再次编译framework bundle文件则正常生成

6: 生成的framework bundle里没有头文件和库文件

没有头文件是因为没有在 “Targets -> Build Phases -> Headers” 中添加相应的头文件

没有生成库文件是因为没有在 “Targets -> Build Phases -> Compile Sources” 中添加任何源文件

7: 编译错误”ISO C++ forbids forward references to ‘enum’ types”

这是因为没有包含该枚举定义的头文件 包含相应的头文件即可

8: 引用framework的工程链接时出错(1)

Undefined symbols for architecture x86_64:

make-framework-problems_04

链接出错的原因比较多 这里解决的是因架构不一致导致的问题

首先查看framework bundle里的库文件的架构 是”armv7 arm64” 即 “iOS Device”

make-framework-problems_05

而引用framework的工程编译的目标架构是”x86_64” 即 “iOS Simulator”

所以需要让framework的架构和引用framework的架构保持一致 即可解决该链接错误

9: 引用framework的工程链接错误(2)

“_ALAssetPropertyType”, referenced from: iPhoneMediaManager::getMediaIds(ALAsset, int, int, Funambol::ArrayList) in make-framework

这是因为framework工程依赖的framework并没有包含到实际工程中来

添加所依赖的第三方framework如下

make-framework-problems_06

10: 引用framework的工程链接错误(3)

Undefined symbols for architecture armv7: “vtable for cxxabiv1::vmi_class_type_info”, referenced from: typeinfo for Funambol::ArrayListEnumeration in make-framework NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.

这是因为framework工程使用的是”Objective-C++“编译器编译的 所引用framework的工程默认的是”Objective-C”编译器编译

这里可以将工程中任意一个”.m”的源文件扩展名修改成”.mm”

或者将”Build Settings -> Apple LLVM 6.2 - Language -> Compile Sources As” 也修改成 “Objective-C++”

11: 引用framework的工程链接错误(4)

ld: warning: directory not found for option ‘-L/Users/yuanlin/Workspace/CloudPhone/CloudPhone/Library/FunambolLib’

找不到链接目标文件夹 需要将已删除的文件夹从 “Build Settings -> Library Search paths” 中删除

12: 引用framework的工程链接错误(5)

ld: 2 duplicate symbols for architecture armv7

有两种可能性:

(1) 项目的不同group里有相同名称的类 因为Objective-C不支持命名空间 所以推荐要加上命名前缀

这里是因为framework工程和引用framework的工程分别引用了”OpenUDID.h” 导致出现了重复定义 暂时是通过修改其中一个类名来解决该链接错误

(2) xcode的自动完成特性 在你导入头文件的时候 将”.h”补成了”.m”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值