与静态库链接

时间:2020-04-18 15:32:45

标签: c linker static-libraries static-linking

与我创建的静态库链接时遇到麻烦。这是我的目录结构:

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

请让我知道我在这里想念的东西。

1 个答案:

答案 0 :(得分:2)

您需要将库放在末尾(源文件之后):

gcc -L.. a.c -lb

当在命令行上看到链接器时,链接器仅搜索该库一次。如果此时没有未定义的符号,则不会再次查看。

摘自ld(1)文档:

链接器仅在存档位置搜索一次存档 在命令行上指定。如果档案库定义了符号 在出现在存档之前的某些对象中未定义 在命令行上,链接器将包含适当的文件 从档案中。但是,出现在对象中的未定义符号 稍后在命令行上将不会导致链接器搜索 再次存档。