Вопрос новичка, пытающегося понять, как компоновщик ищет статическую библиотеку - PullRequest
1 голос
/ 02 февраля 2010

У меня есть рабочая установка, где все файлы находятся в одном каталоге (рабочий стол). Вывод терминала выглядит так:

$ gcc -c mymath.c
$ ar r mymath.a mymath.o
ar: creating archive mymath.a
$ ranlib mymath.a
$ gcc test.c mymath.a -o test
$ ./test
Hello World!
3.14
1.77
10.20

Файлы:

mymath.c:

float mysqrt(float n) {
  return 10.2;
}

test.c:

#include <math.h>
#include <stdio.h>
#include "mymath.h"

main() {
  printf("Hello World!\n");
  float x = sqrt(M_PI);
  printf("%3.2f\n", M_PI);
  printf("%3.2f\n", sqrt(M_PI));
  printf("%3.2f\n", mysqrt(M_PI));
  return 0;
}

Теперь я перемещаю архив mymath.a в подкаталог / temp. Я не смог получить ссылку на работу:

$ gcc test.c mymath.a -o test -l/Users/telliott_admin/Desktop/temp/mymath.a
i686-apple-darwin10-gcc-4.2.1: mymath.a: No such file or directory

$ gcc test.c -o test -I/Users/telliott_admin/Desktop/temp -lmymath
ld: library not found for -lmymath
collect2: ld returned 1 exit status

Что мне не хватает? Какие ресурсы вы бы порекомендовали?

Обновление: спасибо за вашу помощь. Все ответы были в основном правильными. Я писал об этом здесь .

Ответы [ 3 ]

2 голосов
/ 02 февраля 2010
$ gcc test.c /Users/telliott_admin/Desktop/temp/mymath.a -o test

edit: gcc нужен только полный путь к библиотеке для статических библиотек. Вы используете -L, чтобы указать путь, по которому gcc должен искать в сочетании с -l.

1 голос
/ 02 февраля 2010

Чтобы ld мог найти библиотеку с -l, она должна быть названа в соответствии с шаблоном lib yourname .a. Тогда вы используете -lmymath

Итак, нет способа заставить его взять /temp/mymath.a с -l.

Если вы назвали его libmymath.a, то -L / temp -lmymath найдет его.

1 голос
/ 02 февраля 2010

Чтобы включить математические библиотеки, используйте -lm, а не -lmath. Кроме того, вам нужно использовать -L с подкаталогом, чтобы включить библиотеку при компоновке (-Я просто включаю заголовок для компиляции).

Вы можете скомпилировать и связать с:

gcc test.c -o test -I/Users/telliott_admin/Desktop/temp /Users/telliott_admin/Desktop/temp/mymath.a

или с

gcc test.c -o test -I/Users/telliott_admin/Desktop/temp -L/Users/telliott_admin/Desktop/temp -lmymath

где mymath.a переименовывается в libmymath.a.

См. текст ссылки для комментариев (поиск "плохое программирование") о практике использования -l:

...