标签: weak-linking

弱链接框架

由于adMob包的最后一个版本,我已将MessageUI框架添加到我的项目中.由于我希望将我的应用程序部署到2.x OS设备,我建议使用弱链接的MessageUI.

如果我为iPhone设备3.0构建,它工作正常.

如果我为iPhone设备2.2.1构建,我收到一个链接错误:"ld:框架未找到MessageUI"

我哪里错了?

iphone linker frameworks weak-linking messageui

7
推荐指数
2
解决办法
5837
查看次数

弱连接基金会和UIKit?

我最近通过AirPrint介绍了Printing,但是不想放弃对4.2版本的支持(显然).以前做过像Game Center这样的事情.在这种情况下,我发现特别奇怪的是我必须弱连接UIKit.打印不包含在自己的框架中,使我更精细.

这只是感觉不对,虽然它解决了我的问题,允许应用程序在所有版本上正常运行.

Apple的SDK兼容性指南中,他们指出:

使用部署目标中可用的框架时,您应该要求该框架(而不是弱链接).

UIKit中可用的,只是不类,如UIPrintInfo,UIPrintInteractionController等.

我是对的,弱连接这样一个核心框架似乎很奇怪吗?有没有更好的办法?

iphone weak-linking

6
推荐指数
1
解决办法
1830
查看次数

iOS Framework弱链接:未定义符号错误

我正在构建我自己的框架,建议将其分发给其他开发人员以包括他们的项目.该框架可选地链接某些框架(例如CoreLocation).问题是,当我将我的框架链接到在Build Phases中不包含CoreLocation的真实独立项目时,我在尝试构建此主机项目时遇到链接器错误,如"未定义的架构符号"

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_CLLocationManager", referenced from:
      objc-class-ref in MySDK(MyServerConnection.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

是否有可能避免这种情况,因为我不想强迫开发人员将CoreLocation包含在他们的项目中?实际上,我知道这是可能的,但我该怎么做呢?

frameworks objective-c weak-linking ios

6
推荐指数
1
解决办法
3058
查看次数

Xcode 7:-weak_library和-bitcode_bundle不能一起使用

当使用Xcode7部署到iPhone和Apple Watch时,我收到此错误:

ld:-weak_library和-bitcode_bundle(Xcode设置ENABLE_BITCODE = YES)不能一起使用

想问一下如何最好地解决这个问题?

后续行动:Apple Watch需要基于bitcode的库,基于iOS 9中的新警告 - >我们可能必须为所有库启用bitcode.

ld weak-linking xcode7 bitcode

6
推荐指数
1
解决办法
1644
查看次数

llvm/clang是否支持弱链接的"弱"属性?

简言之:确实llvm/ clang支持"弱"属性?

我正在学习一些Arduino库源(HardwareSerial.cpp更详细),我发现了一些weak我之前从未使用过的有趣属性:

#if defined(HAVE_HWSERIAL0)
  void serialEvent() __attribute__((weak));
  bool Serial0_available() __attribute__((weak));
#endif
Run Code Online (Sandbox Code Playgroud)

我发现它很有趣,我已经读过,如果没有定义,链接器应该将它设置为NULL.

但是在我的测试中,clang我无法使用它.

lib.cpp:

#include "lib.h"
#include <stdio.h>

void my_weak_func() __attribute__((weak));

void lib_func() {
    printf("lib_func()\n");

    if (my_weak_func)
        my_weak_func();
}
Run Code Online (Sandbox Code Playgroud)

lib.h:

#ifndef LIB_FUNC
#define LIB_FUNC

void lib_func();

#endif
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include "lib.h"
#include <stdio.h>

#ifdef DEFINE_WEAK
void my_weak_func() {
    printf("my_weak_func()\n"); 
}
#endif

int main() {

    lib_func();

    printf("finished\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用g++ lib.cpp main.cpp -o main -DDEFINE_WEAK我能够使用它:

MBA-Anton:Weak_issue asmirnov$ ./main
lib_func()
my_weak_func()
finished …
Run Code Online (Sandbox Code Playgroud)

c++ linker llvm clang weak-linking

6
推荐指数
2
解决办法
4416
查看次数

与静态库的弱链接

我在 .c 文件中声明了一个带有 GCC 弱属性的外部函数:

extern int weakFunction( ) __attribute__ ((weak));
Run Code Online (Sandbox Code Playgroud)

编译后的目标文件将weakFunction 定义为弱符号。nm 的输出:

1791:         w weakFunction
Run Code Online (Sandbox Code Playgroud)

我调用弱定义函数如下:

if (weakFunction != NULL)
{
    weakFunction();
}
Run Code Online (Sandbox Code Playgroud)

当我通过将目标文件定义为 GCC ( gcc main.o weakf.o -o main.exe) 弱符号的参数来链接程序时,工作正常。如果我将weakf.o 排除在链接之外,则main.c 中的函数地址为NULL,并且不会调用该函数。

问题是,当weakf.o 在静态库中时,由于某种原因链接器找不到该函数,函数地址总是以NULL 结尾。使用 ar 创建静态库:ar rcs weaklibrary weakf.o

有人遇到过类似的问题吗?

c gcc static-libraries weak-linking

5
推荐指数
1
解决办法
3788
查看次数

GCC -O2 和 __attribute__((弱))

它看起来像 GCC,-O2__attribute__((weak))根据您引用弱符号的方式产生不同的结果。考虑一下:

$ catweak.c

#include <stdio.h>

extern const int weaksym1;
const int weaksym1 __attribute__(( weak )) = 0;

extern const int weaksym2;
const int weaksym2 __attribute__(( weak )) = 0;

extern int weaksym3;
int weaksym3 __attribute__(( weak )) = 0;

void testweak(void)
{
    if ( weaksym1 == 0 )
    {
        printf( "0\n" );
    }
    else
    {
        printf( "1\n" );
    }

    printf( "%d\n", weaksym2 );


    if ( weaksym3 == 0 )
    {
        printf( "0\n" );
    }
    else …
Run Code Online (Sandbox Code Playgroud)

c gcc weak-linking

5
推荐指数
1
解决办法
2511
查看次数

弱连接与"--as-needed"

我在使用包含弱符号和--as-needed链接器标志的库时遇到了麻烦.

(这使用了Jack库)

$ cat <<EOF >myjack.c
#include <jack/weakjack.h>
#include <jack/jack.h>
int main() {
  if (jack_client_opent)
     jack_client_open("foobar", JackNoStartServer, 0, 0);
  else return 1;
  return 0;
}
EOF

$ gcc -o myjack myjack.c  -Wl,--no-as-needed -ljack

$ ./myjack && echo "ok" || echo "K.O."
ok

$ ldd myjack | grep jack
    libjack.so.0 => /usr/lib/x86_64-linux-gnu/libjack.so.0 (0x00007f16f615f000)

$ gcc -o myjack myjack.c  -Wl,--as-needed -ljack

$ ./myjack && echo "ok" || echo "K.O."
K.O.

$ ldd myjack | grep jack

$ …
Run Code Online (Sandbox Code Playgroud)

linker gcc weak-linking jack

5
推荐指数
1
解决办法
2572
查看次数

在运行时检查 Swift 中第三方框架的弱链接符号

在 macOS 上,我使用必须由用户安装的外部框架(用 C 编写)。在 Swift 中,我需要在运行时检查它是否存在,并且我不能使用 #available() 因为它用于与操作系统相关的功能,并且我正在尝试追踪外部框架。另外,NSClassFromString() 没有用,因为它不是 Objective-C 框架。

我一直在尝试了解如何复制 Objective-C 等效项来检查弱链接符号,例如:

if ( anExternalFunction == NULL ) {
    // fail graciously
} else {
    // do my thing
}
Run Code Online (Sandbox Code Playgroud)

但在 Swift 中,这似乎不起作用:编译器指出,由于 anExternalFunction 不是可选的,所以我总是会得到 != nil,这使得“Swift 有意义”,但对我没有一点帮助。

我找到了两种解决方案,但它们让我的代码变得很糟糕,就像你不会相信的那样:

选项 1,使用名为 isFrameworkAvailable() 的函数创建一个 Objective-C 文件来完成工作,并从 Swift 调用

选项 2,使用以下 Swift 代码实际检查库:

let libHandle = dlopen("/Library/Frameworks/TheLib.framework/TheLib", RTLD_NOW)

if (libHandle != nil) {
    if dlsym(libHandle, "anExternalFunction") != nil {
        return true
    }
}
return false
Run Code Online (Sandbox Code Playgroud)

我一直无法让选项 2 与 RTLD_DEFAULT …

dll frameworks dlsym weak-linking swift

5
推荐指数
1
解决办法
732
查看次数

bitcode 是否支持弱链接第三方框架?

问题在标题中简单说明。这是我的设置:

构建一个动态框架,可选择链接(弱链接)到 GoogleInteractiveMediaAds.framework。对于使用我的框架的应用程序,GoogleInteractiveMediaAds 是一个可选的依赖项,如果没有它,框架也能正常工作。这是目前工作。

然而,当尝试从位码重建时会出现问题,这通常发生在选择“从位码重建”导出 Ad Hoc 构建时。位码编译过程失败:

ipatool failed with an exception: #<CmdSpec::NonZeroExitException: $/Applications/Xcode.app/Contents/Developer/usr/bin/bitcode-build-tool ...
Run Code Online (Sandbox Code Playgroud)

并深入查看日志文件,我找到了错误描述:

Failed to resolve linkage dependency MyFramework arm64 -> @rpath/GoogleInteractiveMediaAds.framework/GoogleInteractiveMediaAds: Could not resolve @rpath in @rpath/GoogleInteractiveMediaAds.framework/GoogleInteractiveMediaAds from MyFramework
error: GoogleInteractiveMediaAds not found in dylib search path
Run Code Online (Sandbox Code Playgroud)

注意:GoogleInteractiveMediaAds.framework 确实包含位码。

显然,这个错误是通过不选择“从位码重建”来避免的。如果我要回答我自己的问题,我会说,不,看起来从 bitcode 编译时,您不能使用弱链接框架。仅仅是因为 bitcode 编译步骤试图链接到未包含在应用程序目标中的框架。但是,我无法找到任何关于使用位码弱链接的官方文档,或者任何相关的 StackOverflow 答案,所以我不确定我是否遗漏了什么,或者是否有一些相关的编译器/链接器设置我很想让它发挥作用。

frameworks llvm weak-linking ios bitcode

5
推荐指数
1
解决办法
366
查看次数

标签 统计

weak-linking ×10

frameworks ×4

gcc ×3

linker ×3

bitcode ×2

c ×2

ios ×2

iphone ×2

llvm ×2

c++ ×1

clang ×1

dll ×1

dlsym ×1

jack ×1

ld ×1

messageui ×1

objective-c ×1

static-libraries ×1

swift ×1

xcode7 ×1