我正在尝试创建一个通用的iPhone应用程序,但它使用的是仅在较新版本的SDK中定义的类.该框架存在于较旧的系统上,但框架中定义的类不存在.
我知道我想使用某种弱链接,但我能找到的任何文档都讨论了函数存在的运行时检查 - 如何检查一个类是否存在?
GCC能够通过虚拟方式建立符号链接__attribute__((weak))
.我想在静态库中使用弱符号,用户可以在其应用程序中覆盖它.一个GCC风格的弱符号会让我这样做,但我不知道它是否可以用visual studio完成.
Visual Studio是否提供类似功能?
我需要弱化一些框架与我的目标.
但我找不到怎么做......
如果我尝试在3.2模拟器上运行我的项目,我会收到以下错误:
dyld: Library not loaded: /System/Library/Frameworks/iAd.framework/iAd
Reason : Image not found
Run Code Online (Sandbox Code Playgroud)
谢谢 !
我的问题可归纳如下:
bar.c:
#include <stdio.h>
void bar() {
printf("bar\n");
}
Run Code Online (Sandbox Code Playgroud)
main.c:
#include <stdio.h>
void __attribute__((weak)) bar() {
printf("foo\n");
}
int main() {
bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Makefile:
all:
gcc -c bar.c
ar -rc libbar.a bar.o
gcc main.c -L. -lbar
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./a.out
foo
Run Code Online (Sandbox Code Playgroud)
所以main.c中的弱符号栏不会被bar.c中的强符号覆盖,因为bar.c被链接到静态库libbar.a中的main.c.
我如何告诉gcc在libbar.a中使用强符号来覆盖main.c中的弱符号?
在Xcode中,我可以将框架设置为"Optional"而不是"Required",这意味着框架是弱链接的.
这是否意味着框架只在某个地方导入时才包含在捆绑包中?
我想弱连接一些使用私有API的调试框架,我不希望它们出现在App Store构建中.
我有一个主要针对3.0的iPhone应用程序,但是当它们可用时它会利用更新的API.代码是这样的:
if (UIApplicationDidEnterBackgroundNotification != NULL) {
[nc
addObserver: self
selector: @selector(irrelevantCallbackName:)
name: UIApplicationDidEnterBackgroundNotification
object: nil];
}
Run Code Online (Sandbox Code Playgroud)
现在,根据Apple所说的一切,如果相关的API链接很弱,那么它将正常工作,因为动态链接器将评估UIApplicationDidEnterBackgroundNotification
为NULL
.除了它没有.应用程序编译,但一旦它命中if (UIApplicationDidEnterBackgroundNotification != NULL)
它崩溃EXC_BAD_ACCESS
.
这只是我需要设置的编译器标志的问题吗?或者我是以错误的方式来做这件事的?
分析这个问题,我dlopen
在Linux上的动态加载()上下文中发现了一些关于弱符号解析行为的事情.现在我正在寻找管理这个的规范.
我们来举个例子吧.假设有一个程序a
可以动态加载库b.so
,并c.so
按此顺序.如果c.so
依赖于另外两个库foo.so
(实际上libgcc.so
在该示例中)和bar.so
(实际上libpthread.so
),则通常bar.so
可以使用导出的符号来满足弱符号链接foo.so
.但是,如果b.so
还依赖foo.so
但不依赖bar.so
,那么这些弱的符号显然不会被联系起来bar.so
.看起来好像foo.so
墨水只是从a
和b.so
它们的所有依赖项中寻找符号.
这在某种程度上是有道理的,因为否则加载c.so
可能会改变已经使用库的foo.so
某些点的行为b.so
.另一方面,在让我开始的问题中,这引起了相当多的麻烦,所以我想知道是否有办法解决这个问题.为了找到解决方法,我首先需要很好地理解在这些情况下如何指定符号解析的非常精确的细节.
在这些场景中定义正确行为的规范或其他技术文档是什么?
linux dynamic-linking dynamic-loading weak-linking symbol-table
假设在Apple API版本1.0中,有一个具有属性"color"的NSFoo类.API 1.1添加了属性"大小".
我想知道我是否可以使用getter:myFoo.size
[myFoo respondsToSelector:@selector(getSize)]无法按预期工作.
找出对象是否具有属性的正确方法是什么?谢谢!
我正在尝试使用Xcode 6提供的新模板来构建一个iOS框架(Test.framework)来创建Cocoa Touch Frameworks.该框架具有Podfile中指定的不同依赖关系(如AFNetworking或FacebookSDK).我不希望将依赖项包含在框架中,我只想链接它们.
问题是,当我构建框架时,libPods.a被链接并包含在内. 问:我如何链接libPods.a库,但不包含在框架中?
更多细节:
我已经阅读了弱链接:https: //developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html 但是我没有太多使用项目设置的经验,所以我'我不是专业人士.
我试图把libPods.a作为"可选"但没有改变,依赖仍然包括在内.
我尝试从Build Phases中的"Link Binary With Libraries"部分删除libPods.a,但是我收到此错误(在清理项目文件夹并再次构建之后):
ld: library not found for -lPods-MyFramework-AFNetworking
Run Code Online (Sandbox Code Playgroud)
我试图从"其他链接器标志"中删除所有标志,但它给了我未定义的符号:
Undefined symbols for architecture armv7:
"_OBJC_CLASS_$_FBSession", referenced from:
objc-class-ref in TestClass.o
ld: symbol(s) not found for architecture armv7
Run Code Online (Sandbox Code Playgroud)
以下是包含库的干净项目的源代码:https: //www.dropbox.com/sh/0ymuzw6kiagz02j/AABzyHiZVaQQvBEnjBgRBq3ua?dl = 0
由于adMob包的最后一个版本,我已将MessageUI框架添加到我的项目中.由于我希望将我的应用程序部署到2.x OS设备,我建议使用弱链接的MessageUI.
如果我为iPhone设备3.0构建,它工作正常.
如果我为iPhone设备2.2.1构建,我收到一个链接错误:"ld:框架未找到MessageUI"
我哪里错了?
weak-linking ×10
frameworks ×4
ios ×3
iphone ×3
objective-c ×3
c ×2
gcc ×2
xcode ×2
c++ ×1
cocoapods ×1
ld ×1
linker ×1
linux ×1
messageui ×1
properties ×1
symbol-table ×1