【问题标题】:How to build universal ios static library如何构建通用的ios静态库
【发布时间】:2010-10-23 23:31:12
【问题描述】:

我正在尝试构建一个可用于 ios3.x 和 ios4.x 的静态库。我可以使用 ios3.0 构建一个静态库,该库可以与 ios3.0 中的另一个项目一起使用,但不会在 ios4 中编译。从 ios4 到 ios3 也是如此。

以下是重新创建的方法:

  1. 打开 XCode 3.2.4 并启动一个新项目,它是一个名为 Library4 的 Cocoa Touch 静态库
  2. 单击类文件夹并创建一个名为“TestViewController”的新 UIViewController
  3. 右键Frameworks文件夹,添加已有的framework,选择UIKit
  4. 在左侧面板中,展开目标,右键单击我的库目标,然后单击获取信息。更改所有配置,将基础sdk更改为iphone模拟器4.0,将ios部署目标更改为ios3.0
  5. 单击 Link Library with Binaries 文件夹。在右侧窗格中,将两者的角色更改为“弱”
  6. 构建库
  7. 打开 Xcode 3.2.2 并启动一个名为 Library4Test 的新的基于视图的应用程序
  8. 将 TestViewController.h 复制到类文件夹中
  9. 将 libLibrary4.a 文件复制到 frameworks 文件夹。它会自动添加到目标的链接器阶段
  10. 右键单击 Library4Test 目标并单击获取信息。在其他链接器标志中,添加“-ObjC”和“-all_load”
  11. 在应用委托标头中添加 Import "TestViewController.h"
  12. 在应用程序委托头的应用程序的 didFinishLaunchingWithOptions 方法中添加

    TestViewController *test = [TestViewController alloc] init;

  13. 用ios3.0模拟器编译

当我编译时,我得到:

Ld build/Debug-iphonesimulator/library4Test.app/library4Test normal i386
cd /Users/test/Documents/Testing/library4Test
setenv MACOSX_DEPLOYMENT_TARGET 10.5
setenv PATH "/Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/GrandpaIPhone/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Developer/GrandpaIPhone/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk -L/Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator -L/Users/test/Documents/Testing/library4Test -F/Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator -filelist /Users/test/Documents/Testing/library4Test/build/library4Test.build/Debug-iphonesimulator/library4Test.build/Objects-normal/i386/library4Test.LinkFileList -mmacosx-version-min=10.5 -framework Foundation -framework UIKit -framework CoreGraphics -llibrary4_1 -o /Users/test/Documents/Testing/library4Test/build/Debug-iphonesimulator/library4Test.app/library4Test

Undefined symbols:
"_objc_msgSendSuper2", referenced from:
-TestViewController didReceiveMemoryWarning in liblibrary4_1.a(TestViewController.o)
-TestViewController viewDidUnload in liblibrary4_1.a(TestViewController.o)
-TestViewController dealloc in liblibrary4_1.a(TestViewController.o)
"__objc_empty_vtable", referenced from:
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
_OBJC_CLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
"_OBJC_CLASS_$_UIViewController", referenced from:
_OBJC_CLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
"_OBJC_METACLASS_$_UIViewController", referenced from:
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
".objc_class_name_TestViewController", referenced from:
literal-pointer@__OBJC@__cls_refs@TestViewController in library4_1os3TestAppDelegate.o
"_OBJC_METACLASS_$_NSObject", referenced from:
_OBJC_METACLASS_$_TestViewController in liblibrary4_1.a(TestViewController.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status

【问题讨论】:

标签: iphone xcode ios universal-binary static-libraries


【解决方案1】:

不确定,但它看起来像一个链接问题(所有这些 .o 东西)。这是我设置 iOS 静态库的方法。这是一件非常简单的事情,但它确实有效。

  1. 新建项目,选择iOS Libarary >> Cocoa Touch Static Library
  2. 添加一些类。我的是 UIView 上的类别,它们为在 NSLog 中的使用提供了更好的描述。
  3. 选择目标并确保将每个类的角色设置为适当的值。就我的类别而言,应该是“公开的”。
  4. 双击目标并选择“构建”选项卡。
  5. 选择配置版本并设置以下构建设置:
  6. 部署位置是(检查)
    部署后处理是(检查)
    安装构建 产品位置/

构建您的静态库。默认情况下,它将构建在 /usr/local/lib

现在创建一个符号链接,以便轻松访问您的新库。一种简单的方法是打开终端并运行以下命令:

cd ~    
ln -s /usr/local/lib

现在打开要在其中使用库的 Xcode 项目。创建一个名为 Libraries 或类似名称的组,按住 ctrl 单击并使用“添加现有文件”添加库。它将被称为 libYourLibrary.a 当你运行你的项目时,你会得到一个链接错误。因此,双击 project 文件,转到 Build >> All 配置并将以下值添加到“Library Search Paths”设置:~/lib

【讨论】:

【解决方案2】:

您只是通过 sdk 创建一个目标吗?我为 iOS-OSx 创建了一个静态库,过程要简单得多。

  1. 创建项目(来自 iOS 模板“Cocoa touch 静态库”)
  2. 添加源文件
  3. 为 sdk 添加一个目标

当然我必须添加一些

#if TARGET_OS_IPHONE
...
#else
...
#endif

到代码。您可以添加自己的条件。

【讨论】:

    【解决方案3】:

    发生编译器错误是因为您没有链接到正确的系统框架。所有深红色符号均来自 Foundation.framework、UIKit.framework 和 libobjc.dylib。

    静态库不会自动引入它们需要链接的所需框架,因此当您使用它们时,您必须自己将它们添加到项目中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多