在MacOSX上静态链接时找不到符号

时间:2017-06-03 12:19:47

标签: linker clang static-libraries

我正在尝试创建一个静态库并将其链接到MacOS X(多个版本): 档案foo.c

char foo[111];

档案bar.c

#include <string.h>

extern char foo[];

int bar(char *src) {
  strcpy(foo, src);
  return strlen(foo);
}

创建一个库:

$ cc -c foo.c bar.c
$ ar r libfoobar.a foo.o bar.o
ar: creating archive libfoobar.a
$ ranlib libfoobar.a 
$ nm libfoobar.a 

libfoobar.a(foo.o):
000000000000006f C _foo

libfoobar.a(bar.o):
                 U ___strcpy_chk
0000000000000000 T _bar
                 U _foo
                 U _strlen

创建一个小型测试程序:

档案main.c

#include <stdio.h>

int bar(char *);

int main(void) {
  printf("foobarbar = %i\n", bar("123"));
  return 0;
}

编译和链接:

$ cc -c main.c
$ cc -o m main.o -L. -lfoobar
Undefined symbols for architecture x86_64:
  "_foo", referenced from:
      _bar in libfoobar.a(bar.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

为什么找不到符号?它在foo.c中定义?至少ranlib不应该在库中创建一个允许随机输入文件的索引吗?

相同的代码在Linux(gcc)下运行良好,并且foo.c中的符号不​​是char数组,而是int。

1 个答案:

答案 0 :(得分:1)

有一个类似的问题:Object files not properly added to archive on macthis answer

Option 1:

ar -rs my_archive.a foo.o bar.o other_object_files.o
ranlib -c my_archive.a

Option 2:

libtool -c -static -o my_archive.a foo.o bar.o other_object_files.o

-c标记分别对ranliblibtool上的两个选项产生影响:

  

-c

     

包含公共符号作为表格的定义                 的内容。这很少是链接的预期行为                 从库中强制链接库成员                 仅仅因为它使用未初始化的未初始化的全局                 在链接的那一点。此选项仅包含在内                 因为这是ranlib的原始行为。这个选项                 不是默认值。