与我创建的静态库链接时遇到麻烦。这是我的目录结构:
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: %d\n", i);
}
a.c:
#include "../i.h"
int main (void)
{
f (23);
printf ("%d\n", 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
,该命令按预期运行。问题是当我尝试使用以下方法与libb.a
链接时: gcc -L.. -lb a.c
内部的{1}}链接程序在抱怨:
test/t
请让我知道我在这里想念的东西。
答案 0 :(得分:2)
您需要将库放在末尾(源文件之后):
gcc -L.. a.c -lb
当在命令行上看到链接器时,链接器仅搜索该库一次。如果此时没有未定义的符号,则不会再次查看。
摘自ld(1)
文档:
链接器仅在存档位置搜索一次存档 在命令行上指定。如果档案库定义了符号 在出现在存档之前的某些对象中未定义 在命令行上,链接器将包含适当的文件 从档案中。但是,出现在对象中的未定义符号 稍后在命令行上将不会导致链接器搜索 再次存档。