初学者的问题,试图了解链接器如何搜索静态库

时间:2010-02-02 19:54:55

标签: macos linker-errors

我有一个工作设置,其中所有文件都在同一目录(桌面)。终端输出如下:

$ 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

我错过了什么?你会推荐什么资源?

更新:感谢您的帮助。所有答案基本都是正确的。我在博客上发表了here

3 个答案:

答案 0 :(得分:2)

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

编辑:gcc只需要静态库的库的完整路径。您使用-L给出gcc应与-l。

一起搜索的路径

答案 1 :(得分:1)

要包含数学库,请使用-lm,而不是-lmath。此外,您需要在链接时使用-L和子目录来包含库(-I只包含用于编译的标题)。

您可以编译并链接:

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。

请参阅link text,了解有关使用-l的做法的评论(搜索“错误编程”)

答案 2 :(得分:1)

为了让ld找到带-l的库,必须根据模式lib yourname .a命名。然后你使用-lmymath

所以,没有办法让-temp / mymath.a与-l一起使用。

如果你把它命名为libmymath.a,那么-L / temp -lmymath会找到它。