草庐IT

iphone - 新版本的 xcode 是否支持跨项目引用以添加用于链接的静态库?

coder 2024-01-17 原文

我在 iOS 中看到一些静态库项目。我看到两种不同类型的链接静态库。

a) 将.a静态库添加到新的xcode项目及其头文件中。这意味着通用静态库。

b) 将.a 静态库添加到新的xcode 项目并添加创建静态库的xcode 项目。这称为跨项目引用?示例:adding cocos2d to xcode 3.2

当我从第二个项目中删除通过其创建静态库的 xcode 项目时,它给出了错误。我尝试了第二种方法的第一种方法。但它不起作用。

1)您能解释一下为什么不同吗?我们使用的 xcode 版本会有所不同吗?旧 xcode 版本的第二种方法是什么?

2)最近的 xcode 版本(例如 xcode 4.3)是否支持跨项目引用?如果支持,哪种方法更好?这两种方法有什么区别?

最佳答案

我先粗略的解释一下什么是.a文件和框架。在 Cocoa 中,您将类写入 .m 文件中,或多或少在每个文件的类中。当您编译项目时,编译器会一个一个地处理您的每个 .m 文件,并生成源代码的二进制表示(机器代码)以及一些 header 信息,例如对象方法的列表和偏移量。结果是每个 .m 源代码文件对应一个 .o 目标文件。现在,如果您要链接静态库,所有这些目标文件都会打包到给定平台的 .a 存档文件中:i386 用于模拟器,armv7 和 armv7s 用于设备。要使用这些存档,您还需要公开 SDK 的头文件(即使可以从存档中提取相同的信息)。一个 .framework 包是一组简单的这些 .a 文件,用于每个要支持的体系结构,加上公共(public)头文件,可以说很好地打包到一个包中。由于链接是“静态”的,当您链接最终可执行文件时,.o 文件将从 .a 文件中提取并复制到最终可执行文件的二进制文件中。

一些静态库提供商不想向第三方开发人员透露他们的库的源代码,因此只发布 .a 二进制文件。此类库的示例是 Facebook 或 Aviary SDK。当您将 .a 文件添加到您的项目时,您实际上是在添加已编译对象的二进制表示形式。由于您还可以访问 header ,因此即使您无法访问源代码,您仍然可以使用这些二进制文件。

当您处理嵌入式项目时,您可以访问库的源代码。在这种情况下,XCode 将首先编译您的嵌入式项目,再次生成 .o,然后从原始 .m 源代码文件生成 .a 文件。然后它开始编译您的应用程序,该应用程序声明它对库的 .a 文件的依赖性,这次很容易获得,因为它是几秒钟前由 XCode 编译的。所以链接成功。另一方面,当您删除嵌入式项目时,它不仅会删除源代码文件,还会删除生成的 .a 文件,因此最终应用程序的链接将失败。

正如您从最终二进制文件的角度所见,无论您使用预编译的 .a 文件还是嵌入式项目都没有区别,相同的 .o 文件将最终出现在您的最终二进制文件中,只是在第一个文件中在第二种情况下,它们是由图书馆的提供者编译的,而在第二种情况下,它们是由您编译的。即使您可以访问源代码,使用 .a 文件的唯一优点是编译时间稍快一些。缺点是调试器需要额外的配置才能进入库的源代码。

无论如何,如果你想删除嵌入的项目,你可以这样做。将库作为静态库编译一次,并在目标目录中搜索生成的 .a 文件。将每个体系结构的 .a 文件复制到您的应用程序的项目文件夹中,并将它们与公共(public)头文件一起添加到项目中,并编译您的最终应用程序。

关于iphone - 新版本的 xcode 是否支持跨项目引用以添加用于链接的静态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17357111/

有关iphone - 新版本的 xcode 是否支持跨项目引用以添加用于链接的静态库?的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  5. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  6. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  7. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  8. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  9. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  10. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

随机推荐