【问题标题】:Linking with a static library [duplicate]与静态库链接[重复]
【发布时间】:2020-04-18 15:32:45
【问题描述】:

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

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);
}

交流电:

#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,它按预期运行。问题是当我尝试使用gcc -L.. -lb a.c 从内部test/t 链接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

请让我知道我在这里缺少什么。

【问题讨论】:

标签: c linker static-libraries static-linking


【解决方案1】:

你需要把库放在最后(源文件之后):

gcc -L.. a.c -lb

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

来自ld(1) 文档:

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

【讨论】:

    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多