ar вводит неопределенную ссылку - PullRequest
2 голосов
/ 30 октября 2011

Я пытаюсь понять, как использовать статические библиотеки, но самый тривиальный пример терпит неудачу:

//foo.c
int func(int i) {
  return i+1;
}
//main.c
int func(int i);
int main() {
  return func(41);
}

Компиляция foo.c и main.c работает:

gcc -Wall -o foo.o -c foo.c
gcc -Wall -o main.o -c main.c

Архивация foo.o также не жалуется:

ar rcs libfoo.a foo.o

Но соединение не удается с неопределенной ссылкой на func:

ld libfoo.a main.o
ld -L. -lfoo main.o

, оба дают мне:

ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
main.o: In function `main':
main.c:(.text+0xa): undefined reference to `func'

Я получаю аналогичную ошибку, если беру объезд по gcc по ссылке:

gcc libfoo.a main.o
gcc -L. -lfoo main.o

и мне сообщают:

main.o: In function `main':
main.c:(.text+0xa): undefined reference to `func'
collect2: ld returned 1 exit status

Что я здесь не так делаю?В соответствии со всеми руководствами и поисковыми системами, которые я читал / использовал, это способ использовать статические библиотеки.


Редактировать: помните, что gcc foo.o main.o работает отлично.

1 Ответ

1 голос
/ 30 октября 2011

После долгих попыток сделать глупость, самой глупой идеей было решение: ld сначала хочет получить объектные файлы, , а затем архивы.Yay!

gcc libfoo.a main.o  // fails
gcc main.o libfoo.a  // works

То же самое происходит, если вы указываете библиотеку с -L. и -lfoo: куда вы положили -L, по-видимому, не имеет значения, но куда вы положили -lfoo, имеет значениев той же степени, как если бы вы указали файл .a напрямую.

...