- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想创建一个静态库(实际上是一个框架,但是我知道该怎么做)将其他静态库中的代码捆绑在一起。但是,从原始库导出的OBJC_CLASS
最终以未定义符号表示。
例如,在Xcode 5.1.1中(除非另有说明,否则在每个步骤中都使用默认设置/选择):
libLibA.a
从LibA产品拖到LibB项目树中的Frameworks文件夹中。 LibA
目录中将include
拖到LibB项目树的顶层。 LibB.h
。 libLibB.a
从LibB产品拖到AppC项目树中的Frameworks文件夹中。 LibB
从include
目录拖到顶层。 LibA
从第一个项目的include
目录拖到顶层。 LibA
是否出现在“使用库链接二进制文件”阶段。 -[MasterViewController awakeFromNib]
),添加(void)[[LibB alloc] init]
。 .m
文件的顶部,添加#import "LibB.h"
。 LibB.h
:
#import <Foundation/Foundation.h>
#import "LibA.h"
@interface LibB: LibA
@end
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_LibA", referenced from:
_OBJC_CLASS_$_LibB in libLibB.a(LibB.o)
"_OBJC_METACLASS_$_LibA", referenced from:
_OBJC_METACLASS_$_LibB in libLibB.a(LibB.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
$ nm -g libLibB.a
U _OBJC_CLASS_$_LibA
0000031c S _OBJC_CLASS_$_LibB
U _OBJC_METACLASS_$_LibA
00000308 S _OBJC_METACLASS_$_LibB
U _OBJC_METACLASS_$_NSObject
U __objc_empty_cache
_OBJC_CLASS_$_LibA
和
_OBJC_METACLASS_$_LibA
的符号被导出为未定义。
-ObjC
添加为额外的链接器标志。 (这对于静态库没有意义,它所做的只是给您一个警告错误,告诉您确切的信息,但每个人都向我建议。)LibB
)。 (这也只对动态库有意义。)${PROJECT_DIR}/libLibA.a
作为“其他链接器标志”(用于LibB
)传递,而不是将libLibA
作为框架添加(以防-lLibA
与libLibA.a
处理不同的情况)。 libtool
选项,这些选项在Xcode中没有相应的设置。 (如有必要,我可以将其包装在Makefile或Xcode自定义构建步骤中。)${PROJECT_DIR}/libLibA.a
添加到“预链接库”。我收到有关重复符号的警告,然后是成功,但带有一个空libLibB.a
,因此显然我需要做其他事情。我已经在OS X上使用.dylibs和动态框架完成了此操作,而我不需要做其他任何事情了......但是从不使用静态库。 LibB
的人也必须将LibA
添加到他们的项目中。特别是我们提供的LibA
的预构建副本。 LibB
作为要包含在项目中的源,而不是静态的lib和标头。 ar
libLibA.a
和LibB.o
,然后是ranlib
,就像1999年一样(尽管文档说这行不通,但似乎如此)。 ar
无法使用它……),我们正计划对模拟器和本机构建进行lipo'ing的常规编程,从而使它们成为一个问题。
最佳答案
我想我可能已经通过单对象预链接解决了它(基本上这意味着它会执行ld -r
来构建一个巨大的目标文件,然后将其传递给libtool
),尽管我仍然不确定,而且我不喜欢这种解决方案。因此,我将发布我得到的答案,但希望其他人也能提供更好的答案。
要使单对象预链接正常工作,您需要(在LibB
中):
libLibA.a
作为框架。 ${PROJECT_DIR}/libLibA.a
AppC
和我的真实项目都适用。
AppC
不需要“保留专用外部符号”;我的真实项目确实如此。我相信这是因为其中一个第三方库使用明确的空
ld -r
来执行
-exported_symbols_list
,以“将所有符号都转换为
private_extern
。否则,类对象不会以这种方式结束。但是,我不确定100%是否确定了解这一点。
关于ios - 从一个静态库导出“OBJC_CLASS”作为另一个库的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25275070/
我想创建一个静态库(实际上是一个框架,但是我知道该怎么做)将其他静态库中的代码捆绑在一起。但是,从原始库导出的OBJC_CLASS最终以未定义符号表示。 例如,在Xcode 5.1.1中(除非另有说明
我有以下方法: - (FDModel *)_modelForClass: (Class)modelClass withIdentifier: (NSString *)identifier 它应
我正在尝试实现一个单例来管理 NSURLSession 请求。这是我的代码: 头文件: @interface httpRequest : NSObject @property (strong,nona
方法列表和协议(protocol)都是链表,protocols是一个指针,而methodLists是一个指向指针的指针,为什么? 最佳答案 这是一个实现细节,它是 Objective-C 的历史和动态
查看runtime.h里面,找到了objc_class这个结构体的定义。 在各种成员中,我们有这个:- 结构 objc_method_list **methodLists 我们肯定需要知道一个类有哪些
根据Github/FacebookSDK中的设置进行设置,一切都很好, 但是当运行命令适当的构建时,它给出了这样的错误 .../Source/AppDelegate.m:function L_OBJC
我的理解是,Objective-C 中的对象 和类 只是结构。 分别是: struct objc_class * 和: struct objc_object * 问题 #1: objc_msgSend
这是我用 Objective-C 写的代码,现在我想把它变成 Swift 代码。但是我发现Swift并没有Class修饰符,它的AnyClass,不是我需要的,怎么办? + (void)postJso
我曾在Google日历中工作过。现在,我已从此链接下载示例代码: "http://code.google.com/p/iphone-gcal/". 但是在此代码中,缺少一些Gdata代码。所以我已经实
这个问题已经存在: 关闭 10 年前。 Possible Duplicate: Twitter Framework in IOS 6 我在我的 iPhone 项目中集成了 twitter 框架。但是
Class bah = [NSString class]; id object = [bah new]; 编译完全没有问题。 Class bah = [NSString class]; id obje
我是一名优秀的程序员,十分优秀!