仅使用声明的函数编译动态库

时间:2013-07-05 10:42:07

标签: macos dynamic

此代码在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”,引用   来自:
        _sum in ccK5mZfC.o
ld:找不到架构x86_64的符号
collect2:ld返回1退出状态

您能否请一位gcc选项或选项来检查Xcode IDE来解决这个问题?

祝你好运

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

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