0

此代码在 linux 下编译,但在 mac osx 下不编译(lib.c 内容如下):

int add(int a, int b);

int sum(int a, int b) {return add(a, b);}

在linux中我使用这个命令并且它有效:

gcc -shared -fPIC lib.c -o lib.so

相同的命令在 mac osx 中失败,给出此错误:

架构 x86_64 的未定义符号:
“_add”,引用自:
ccK5mZfC.o 中的 _sum
ld:未找到架构 x86_64 的
符号 collect2:ld 返回 1 个退出状态

您能否建议我使用 gcc 选项或签入 Xcode IDE 来解决此问题的选项?

此致

4

1 回答 1

0

我不相信您可以在工具链中使用未解析的静态外部构建共享库。

您将需要执行以下操作之一:

  • 包含静态添加的模块中的链接
  • 包含动态添加的模块中的链接
  • 在您正在构建的共享库中包含 add 函数

否则,共享库将包含未解析且无法解析的外部,因为加载器无法“修复”从共享库到链接到它的代码的引用。

更新了关于“位置无关代码”的问题:

这不是位置独立性的问题,而是加载器在加载期间能够定位命名符号的问题。尽管这在 linux 中可能是允许的,但在 OSX(基于 FreeBSD 和 MACH)中,加载程序期望共享库中的符号在内部解析,或者通过另一个共享库解析,其中存根是已知的。

您当然可以在不显式引用每个对象的情况下构建静态 (.o) 库,但要构建共享 (.so) 库,您需要确保每个引用的符号都包含在库中或具有外部引用加载器可以在加载时解析。

于 2013-07-05T15:22:22.633 回答