我正在尝试创建一个静态库并将其链接到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。
答案 0 :(得分:1)
有一个类似的问题:Object files not properly added to archive on mac有this 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
标记分别对ranlib
和libtool
上的两个选项产生影响:
-c
包含公共符号作为表格的定义 的内容。这很少是链接的预期行为 从库中强制链接库成员 仅仅因为它使用未初始化的未初始化的全局 在链接的那一点。此选项仅包含在内 因为这是ranlib的原始行为。这个选项 不是默认值。