问题标签 [weak-linking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1101 浏览

iphone - 在 iOS 中测试弱链接符号无法按预期工作

在尝试测试是否存在在较新版本的操作系统中引入的符号时,我遇到了一个奇怪的问题。我遵循Apple关于使用弱链接符号的指南,即

通过显式比较其地址(而不是符号的裸名)与 NULL 或 nil 来检查外部(extern)常量或通知名称的可用性。

为了重现该问题,我在最新的 Xcode 4.5.2 上使用最新的 iOS 6 SDK,使用默认编译器(Apple LLVM 编译器 4.1)。我弱链接了社交框架(仅在 iOS 6+ 上可用)。我在 iOS 5.1 上运行这段代码(部署目标低于 6):

输出是:

换句话说,我们可以在运行时验证表达式&SLServiceTypeFacebook的计算结果是否为 0。然而,if测试该表达式的语句将其视为真。


更新:这个问题,我发现这个解决方法没有优化,但没有优化:


更新: UIKit 符号似乎不存在此问题。在 iOS 4.3 上运行以下命令:

输出是:

我假设不同之处在于 UIKit 符号NS_AVAILABLE_IOS()旁边有一个宏,因此编译器会以某种方式正确处理它。在社交框架符号的情况下,它没有NS_AVAILABLE_IOS()宏,因为整个社交框架本身仅在 iOS 6 之后才可用(即符号从框架版本开始可用,所以我猜不需要这个宏?);但是编译器没有正确处理符号。

0 投票
2 回答
274 浏览

objective-c - 您可以从编译时不可用的 objc 中的类继承吗?

我有继承自UIActivityiOS 6 中引入的代码,它可以使用 Xcode 4.5 编译罚款,并且在 iOS 6 和以前的版本上运行良好(我在运行时检测到类的可用性)。但是,是否可以使用 Xcode 4.4 编译此代码,它的 SDK中不包含该类?UIActivity

如果我转发声明 UIActivity 该dealloc方法不会编译,因为它调用super并且编译器警告我该类已经在继承树的根部。也许有一种方法可以让这个类从我在本地定义的代理类继承,然后在运行时以某种方式调整它并实例化它,就好像它在编译时已经正确定义了一样?这样做的目的是使用 Xcode 4.4 编译代码并使用该幻像类在 iOS 6 上运行二进制文件。

我知道我可以使用定义来阻止我的子类使用 Xcode 4.4 及更早版本进行编译,但这意味着该功能在运行 iOS 6 的设备上不可用。

0 投票
2 回答
494 浏览

ios - 在 MonoTouch 中检查 iOS 类(而不是方法)的可用性

MonoTouch 公开了RespondsToSelector方法,用于检查跨 iOS 版本的方法的可用性。

但是,我似乎不知道如何对课程可用性进行类似的检查。
Apple 在此处记录了在 iOS 4.2+ 中您应该尝试访问class所需类的静态选择器。例如:

然而,这似乎并没有暴露出来。我认为这与我之前的问题类似,因为要在 MT 中实现这一点,需要Class在每个 MT 类型上显式映射静态属性。

所以我想我的问题是,我应该只使用旧的 pre iOS 4.2 技术吗?IE:

我认为映射到:

或者使用Messaging中可用的互操作方法手动调用选择器?

还是我没有找到的其他方法?

0 投票
2 回答
381 浏览

ios - 弱链接框架导致“找不到文件”错误

我正在构建一个使用Social.hAccounts.h框架的应用程序。

我将两个框架都设置为optional. 我有我的Base SDK设置,因为6.0 我已经iOS Deployment Target设置为5.0

当我将应用程序构建到我的 iPhone 运行6.0时,一切正常。当我构建到我的 iPhone 模拟器运行5.0时,我收到错误消息Social/Social.h file not found(我没有收到 Accounts.h 的此错误,这看起来很奇怪。我认为这将是全部或全部。)

0 投票
3 回答
16357 浏览

ios - “弱链接”框架是什么意思?

在 Xcode 中,我可以将框架设置为“可选”而不是“必需”,这意味着该框架是弱链接的。

这是否意味着框架仅在某个地方导入时才包含在捆绑包中?

我想弱链接一些使用私有 API的调试框架,并且我不希望它们出现在 App Store 构建中。

0 投票
1 回答
184 浏览

macos - -weak_framework linker arg not recognized by i686-apple-darwin11-llvm-gcc-4.2

I am trying to weak-link to the Security framework in Mac OS X (10.8.2, Darwin Kernel Version 12.2.1). It appears that the linker is simply not recognizing the '-weak_framework' tag.

This is the linker error I get -

What I found interesting (and hence the reason I believe the '-weak_framework' tag isn't recognized), is that when I change '-weak_framework' to '-thisisgarbage', I still get the same error.

I am running an Ant build script, so this is what's in there -

Any input is greatly appreciated.

0 投票
0 回答
177 浏览

c++ - 有条件的弱链接符号修改/重新声明

我有以下弱链接声明:

问题是,符号可能会也可能不会被定义,具体取决于操作系统。

所以,当我使用它时func(symbolName);,我会收到信号 11 崩溃,因为我正在尝试取消对 null 的引用。我可以问if(&symbolName != NULL) { func(symbolName); },但这需要使用此符号的每个人都记得问过这个问题,这不是最佳选择。

我正在寻找一些神奇的魔法来有条件地修改或重新声明这个符号,只有在不可用的情况下,才有一些我func可以使用的默认值。

我知道这是一个丑陋的解决方案,不推荐。此时,我只想知道有没有办法做到这一点,无论多么丑陋或低级。

0 投票
2 回答
758 浏览

android - OS X 和 Android 共享库中覆盖弱函数的不同行为

我在 OS X 和 Android 之间遇到了不同的行为:

  • 我的共享库中有一个弱功能foo
  • 我想用我的可执行文件中定义的强大功能覆盖它。
  • 我希望被覆盖的也会影响库内的调用

结果:我在 OS X 上得到了预期的结果,但在 Android 上失败了。


这是我的测试项目:

文件:shared.h

文件:shared.c

文件:main.c

我在 OS X 中编译并运行它使用命令:

正如我预期的那样返回结果:


但是当我使用 NDK 工具链为 Android 编译它时,使用相同的命令:

并在设备上运行它,我得到了不同的结果:

为什么行为不同,我该如何解决?

0 投票
0 回答
260 浏览

c++ - 一个共享库的弱符号被另一个覆盖

我有一个与(共享)库 libFoo.so 链接的程序。现在我需要编写该库的补丁版本。称它为 libFooPatch,尽管名称也将是 libFoo.so。这个定义了一个额外的弱符号 Init。

第一种情况(只是为了澄清):
现在假设我会在程序中实现“Init”。在运行时 libFooPatch 通过 LD_LIBRARY_PATH 加载。
如果程序与 libFoo 链接,从 libFooPatch 调用“Init”会导致它仅调用弱引用版本,而不是来自程序的版本。将它与 libFooPatch 链接可以解决这个问题,并且它可以正常工作。
1)但这是为什么呢?不应该在运行时调用程序中强引用的“Init”吗?

现在真正的问题(第二种情况):
我无法更改程序本身。它没有定义“Init”并且与 libFoo 相关联。我可以通过将 libFooPatch 放入 LD_LIBRARY_PATH 来更改仍然不是 libFoo 的 libFooPatch。
我想编写一个在程序中使用的(共享)库 libBar(很可能是 dlopen),将“Init”定义为一个强符号并让 libFooPatch 调用它。
但是我无法让它工作。我自己的 Init 函数永远不会被调用,甚至在 libBar 中获得一个指针也只能让我从 libFooPatch 中获取弱指针。

“nm libBar.so”返回“0000000000000eb0 T Init”,所以它在那里被正确定义,不是吗?

任何指示我怎样才能让它工作?

0 投票
1 回答
9055 浏览

linux - 动态加载和弱符号分辨率

分析这个问题,我发现了一些关于dlopen在 Linux 上动态加载()上下文中弱符号解析的行为。现在我正在寻找管理这个的规范。

让我们举个例子。假设有一个程序a可以动态加载库,b.soc.so按此顺序。如果c.so依赖于其他两个库foo.so(实际上libgcc.so在那个例子中)和bar.so(实际上),那么通常可以使用libpthread.so导出的符号来满足. 但如果还依赖而不依赖,那么这些弱符号显然不会被联系起来。似乎inkages 只从它们的所有依赖项中寻找符号。bar.sofoo.sob.sofoo.sobar.sobar.sofoo.soab.so

这在某种程度上是有道理的,因为否则加载c.so可能会改变已经使用该库foo.so的某个点的行为。b.so另一方面,在让我开始的问题中,这引起了很多麻烦,所以我想知道是否有办法解决这个问题。为了找到解决方法,我首先需要很好地了解在这些情况下如何指定符号解析的非常准确的细节。

在这些场景中定义正确行为的规范或其他技术文档是什么?