iOS程序支持64位以及project.pbxproj文件的介绍

程序从32bit转到64bit总结:

一、出现各种 “OBJC_CLASS$_ShareSDK”, referenced from:

解决方案:

网上版本:

- 选中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等等

…….

四、project.pbxproj文件的介绍

PBXBuildFile与PBXFileReference

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 */

PBXGroup

这个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 */

PBXNativeTarget

该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 */

XCBuildConfiguration与XCConfigurationList

这两个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项。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 13:40:14

iOS程序支持64位以及project.pbxproj文件的介绍的相关文章

iOS 怎么检测app支不支持64位

在2015年2月1日新的iOS应用提交到App Store的开始必须包括64位支持并与iOS 8 SDK构建.2015年6月1日开始的应用程序更新也要遵循同样的要求.为了使项目中的64位,我们建议使用默认的Xcode编译设置"标准结构"来建立一个单一的二进制与32位和64位代码. 在你已经纠正了问题,你可以用Xcode应用程序或上传一个新的二进制iTunes Connect. 1.检测项目中有没有不支持64的sdk (1)Xcode会提示你更新你的项目,其中的警告和错误信息对于转换到6

关于IOS二维码创建、扫描的使用方式(IOS,ZBar支持64位解决办法)

在IOS开发过程中,有时需要使用到二维码扫描及二维码生成,现在介绍我自己测试并通过的方法: (一) 二维码生成方式: 需要工具:libqrencode库,QRCodeGenerator.h,QRCodeGenerator.m文件,说实话,在网上找这两个文件确实废了我不少的功夫,下面我会把详细的下载地址贴上,相信定能节省大家不少的时间. 有了以上两个文件之后你就可以将它添加到你到工程中,使用相应的接口API便可以完成相应的功能. imageview.image = [QRCodeGenerator

[官方] Unity4.6.2发布,支持64位iOS

Unity4.6.2现在已经正式发布并且提供下载,这是Unity第一个支持64位iOS的正式版本,采用了最新的IL2CPP 技术. 下载请访问:http://unity3d.com/cn/unity/download IL2CPP是Unity内部开发的一款创新型脚本技术.它能极大地提高项目中所有脚本的性能,并且完美兼容当前iOS构建所使用的Mono-AOT解决方案. 我们可以使用IL2CPP将脚本快速移植到新平台(例如WebGL等)及架构,ARM64(64位iOS系统架构)就是其中之一.使用Un

iOS第三方平台不支持64位的解决办法

来源地址:http://blog.csdn.net/sky_2016/article/details/39737279 phone5s才用64位双核苹果A7处理器,所以上线的app必须支持64位环境.但是现在有很多第三方平台,不支持64位容易开成以下类似的错误 Undefined symbols for architecture x86_64: \\\\\\\\\\\\\\\"_OBJC_CLASS_$_QQApiInterface\\\\\\\\\\\\\\\", reference

missing required architecture x86_64 in file 不支持64位

(null): Ignoring file /Users/xxx/Desktop/IOS-项目源码/ios/Ios(114.215.200.104)/ShareSDK/Extend/QQConnectSDK/TencentOpenAPI.framework/TencentOpenAPI, missing required architecture x86_64 in file /Users/xxx/Desktop/IOS-项目源码/ios/Ios(xxxx)/ShareSDK/Extend/QQ

delphi下支持64位的钩子实现

从delphi.about.com上找了一个钩子的实现代码,写得很不错,可惜不支持64位,后来有一个帖子里说参考classes单元改改,就自己改了一下,现在分享给大家 修改部分如下 const {$IF Defined(CPUX86)} CodeBytes = 2; {$ELSEIF Defined(CPUX64)} CodeBytes = 8; {$IFEND} type pObjectInstance = ^TObjectInstance; TObjectInstance = packed

C# 32位程序在64位系统下注册表操作

在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制.目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与64位程序冲突 相关资料请查看32位程序在64位系统下运行的重定向机制 下面是以获取操作系统安装密匙KEY的案例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

32位程序移植64位经验

最近移植了一个32位程序到64位,原本以为简单的事,折腾了好几天,现在记录下来过程,供有相关问题的人参考:程序是一个输入法,源代码来自盒子 http://www.2ccc.com/article.asp?articleid=2850,再此感谢刘麻子大侠,输入法大量的使用了windows定义的结构体或记录类型,涉及的数据类型很多,在32到64转换的过程中参考了http://blog.csdn.net/hpjx1987/article/details/51453586,首先感谢作者共享知识,但这里有

32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)

众所周知,取系统的安装时间可取注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion的子项InstallDate,此值是个DWORD类型的UnixStamp.  但是在64位系统上有所不同(仅测试了win7.win8),默认情况下32程序在64位机器上访问的是下面这个地址HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion