Файл может сделать это более сложным для примера.
аюсь создать статическую библиотеку и связать ее с 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
это не массив символов, а int.