Файл может сделать это более сложным для примера.

аюсь создать статическую библиотеку и связать ее с 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.

Ответы на вопрос(1)

Ваш ответ на вопрос