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

ole*_*ole 6 linker clang static-libraries

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

char foo[111];
Run Code Online (Sandbox Code Playgroud)

文件bar.c

#include <string.h>

extern char foo[];

int bar(char *src) {
  strcpy(foo, src);
  return strlen(foo);
}
Run Code Online (Sandbox Code Playgroud)

创建一个库:

$ 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
Run Code Online (Sandbox Code Playgroud)

创建一个小测试程序:

文件main.c

#include <stdio.h>

int bar(char *);

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

编译并链接:

$ 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)
Run Code Online (Sandbox Code Playgroud)

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

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

Sta*_*ich 4

有一个类似的问题:Object files notproperly add to archive on mac这个答案

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
Run Code Online (Sandbox Code Playgroud)

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

-C

包括常用符号作为目录的定义。这很少是从库链接的预期行为,因为它强制链接库成员,只是因为它使用了在链接中该点未定义的未初始化全局。包含此选项只是因为这是 ranlib 的原始行为。此选项不是默认选项。