我在链接我创建的静态库时遇到问题。这是我的目录结构:
test
├── b.c
├── b.o
├── i.h
├── libb.a
└── t
└── a.c
以下是每个文件的内容:
i.h:
#include <stdio.h>
void f (int);
#define LENGTH 4
b.c:
#include "i.h"
void f (int i)
{
printf ("from b.c: %dn", i);
}
a.c:
#include "../i.h"
int main (void)
{
f (23);
printf ("%dn", LENGTH);
}
为了构建b.o
,我发布了:gcc -c i.h b.c
。为了构建libb.a
,我发布了:ar rcs libb.a b.o
。
命令gcc ../b.o a.c
(当从test/t
内部发出时,会产生按预期运行的a.out
。问题是当我试图从test/t
内部使用:gcc -L.. -lb a.c
与libb.a
链接时。链接器抱怨:
$ gcc -L.. -lb a.c
/usr/bin/ld: /tmp/ccbT50MJ.o: in function `main':
a.c:(.text+0xa): undefined reference to `f'
collect2: error: ld returned 1 exit status
请让我知道我在这里缺了什么。
您需要将库放在末尾(在源文件之后(:
gcc -L.. a.c -lb
当在命令行上看到库时,链接器只搜索库一次。如果当时没有未定义的符号,就不会再看了。
来自ld(1)
文档:
链接器只会在存档所在的位置搜索一次在命令行中指定。如果存档定义了一个符号在档案之前出现的某个对象中未定义在命令行上,链接器将包括适当的文件从档案中。但是,对象中出现未定义的符号稍后的命令行不会导致链接器搜索再次归档。