解决方案:
网上版本:
- 选中Targets—>Build Settings—>Architectures。
把build active architectures only 改为 NO。
- 把最下面的Valid Architectures中的arm64参数删掉就可以了(但这样不是反倒不支持64位了?)
或者:
- 双击Architectures,选择other,删除$(ARCH_STANDARD)
,然后增加armv7和armv7s(写上:$(ARCHS_STANDARD_32_BIT)
)。
- clean 再build。
个人解决方案:
Build Settings -> Other Linker Flags -> 加入 -all_load
clang: error: no such file or directory: ‘Foundation’
clang: error: no such file or directory: ‘AdSupport’
既然都是编译时问题那么就应该看一下应用的编译设置文件
查看程序中的编译文件project.pbxproj:
查看方法: -> 找到程序的:程序名.xcodeproj文件 -> 右键显示包内容 -> project.pbxproj
先看一下编译引用路径有没有问题:
2B82218A1B759BF400BDEFB7 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; };
文件指针isa也没有问题。粗略分析下这串字符串的意思:最前面的2B82218A1B759BF400BDEFB7
(我一开始以为应该是文件的MD5值,但后来发现这个值是会变的。所以应该不是,具体是什么有兴趣再来研究研究。)isa为文件的引用关系指针。path就是库文件的相对地址了。而sourceTree应该就是查找库文件的根目录。
这里因为是iOS所以根目录都是指向SDK的存放位置。如果是自己的文件则应该都是`"<group>"`。
路径文件也没有任何问题:
在path = System/Library/Frameworks/AdSupport.framework;路径下能找到该库
在Build Phases -> Link Binary With Libraries 也正常导入。
文件目录下也没有任何红色标记。
在查看编译标记的时候发现了主要问题:
"-framework", UIKit, Foundation
“-framework”,这里使用的编译标记不对啊。删去Foundation或者在Foundation前加”-framework”。所以总结了下原因应该是在使用Build Setting -> Other Link Flags的时候使用不当,因为Other Link Flags设置结果就是直接关联到这部分的内容。
(PS:改这部分真是让我觉得我就是个搬运工。。。累觉不爱)
- int -> NSInteger
- unsigned -> NSUIntege
- float -> CGFloat
- 还有numberWithInt也基本要改成numberWithInteger等等
…….
PBXBuildFile与PBXFileReference这两个section保存中工程文件相关的信息:包含文件的类型,路径,名称等
/* Begin PBXBuildFile section */ 2B82218D1B75AC8800BDEFB7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B82218C1B75AC8800BDEFB7 /* Foundation.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section * F60CC2A014D4EA0500A005E4 /* SocketOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; sourceTree = <group>; }; /* End PBXFileReference section */
这个section保存着工程文件的分组信息:分组的名称,以及该组内含有的文件,比如下面的例子,一个EGOTableViewPullRefresh分组里面还有一个children子分组,同时该组包含EGORefreshTableHeaderView的.h和.m两个文件,该分组对应的相对路径为../Classes/EGOTableViewPullRefresh
E1B4A9DE12FC8B1000EB3F67 /* EGOTableViewPullRefresh */ = { isa = PBXGroup; children = ( E1B4A9DF12FC8B1000EB3F67 /* EGORefreshTableHeaderView.h */, E1B4A9E012FC8B1000EB3F67 /* EGORefreshTableHeaderView.m */, ); name = EGOTableViewPullRefresh; path = ../Classes/EGOTableViewPullRefresh; sourceTree = "<group>"; }; /* End PBXGroup section */
该section保存工程创建的target信息:包含target的对应的配置信息、创建规则、依赖、名称和类型等信息
/* Begin PBXNativeTarget section */ 1D6058900D05DD3D006BFB54 /* MyBaby */ = { isa = PBXNativeTarget; buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "MyBaby" */; buildPhases = ( 1D60588D0D05DD3D006BFB54 /* Resources */, 832D4F01120A6F7C001708D4 /* CopyFiles */, 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, 79289B3ECCA2441197B8D7F6 /* Copy Pods Resources */, ); buildRules = ( ); dependencies = ( ); name = MyBaby; productName = WordPress; productReference = 1D6058910D05DD3D006BFB54 /* My Baby.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */
这两个section保存着工程相关的配置信息:下面对应的是debug模式下的配置信息,可以看到里面包含CODE_SIGN_IDENTITY,sdk,framework的搜索路径等信息。
/* Begin XCBuildConfiguration section */ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = EBC24772E5CD4036B5AFD803 /* Pods.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; CODE_SIGN_ENTITLEMENTS = ""; CODE_SIGN_IDENTITY = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_THUMB_SUPPORT = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = "-Wno-format-security"; OTHER_LDFLAGS = ( "-lxml2", "-licucore", ); PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; VALID_ARCHS = "armv7 arm64 armv7s"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MyBaby" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, 2F30B4C10E342FDF00211B15 /* Distribution */, 83D3E0201215F89F00600B4B /* Beta */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */
通过上面分析一个pbxproj文件的过程可以看出,要创建一个工程,首先需要添加相关的文件,然后设置需要生成的target以及对应的配置信息就行了。
如果编译时出错,除语法上的出错,我们需要检查工程设置文件的部分主要就是检查这些部分在原理上的设置是否正确。根据提示信息去查看相应的内容。就比如我这里遇到的:clang: error: no such file or directory: ‘Foundation’
,就应该去检查PBXBuildFile、PBXFileReference和XCBuildConfiguration项。