C-将程序与两个静态库链接在一起,每个库都包含依赖于另一个功能的函数



我实际上是在尝试从另一个函数b(库存Libb.a)调用函数a(库存),但我有一个链接错误。

有我的文件:

a.c

#include <stdio.h>
void a()
{
  printf("an");
}

B.C

void a();
void b()
{
  a();
}

main.c

void b();
int main(int argc, char const* argv[])
{
  b();
  return (0);
}

以及我如何编译

gcc -c a.c
gcc -c b.c
ar rc liba.a a.o
ar rc libb.a b.o
ranlib liba.a
ranlib libb.a
gcc main.c liba.a libb.a

(确切的消息错误)

b.c:(.text+0xa): undefined reference to `a'

有没有办法做我想做的事?感谢您的时间

编辑:看来命令行中的库顺序很重要。但是在我的真正问题中,liba取决于libb和libb取决于liba(MCVE代码未证明)。

编辑:命令行中的库顺序似乎很重要。但是在我真正的问题上,liba取决于libb和libb取决于liba(MCVE代码未证明)。

您的真正问题是,您已经在角落里画了自己。正确的做法是安排两个库,以便一个库完全独立于另一个库,然后将一个库放在链接命令中。

没有进行更改,您可能会两次提及第一个库,

gcc main.c liba.a libb.a liba.a

在名称分辨率方面,链接器非常简单。从尚未解决的名称列表开始,它可以浏览库列表,并在找到它们的情况下解决名称。它不会注意到您给它liba.a两次;它将解析b提供的a名称,然后解析a提供的b名称。

但是,这种技巧可能有一天会咬您(如果它完全有效)。正如我所说,最好的是分解您的依赖性,并为自己和关注您的人简化事情。

在已经具有a.cb.cmain.c的同一目录中创建以下Makefile

#!/usr/bin/make
ar:
        gcc -o a.o -c a.c
        gcc -o b.o -c b.c
        gcc -o m.o -c main.c
        ar rc liba.a a.o
        ar rc libb.a b.o
        ar rc libm.a m.o
        ranlib liba.a
        ranlib libb.a
        ranlib libm.a
        gcc -o main m.o a.o b.o
install:
        gcc -o a.o -c a.c
        gcc -o b.o -c b.c
        gcc -o m.o -c main.c
        gcc -o main m.o a.o b.o
clean:
        rm -f *.o
        rm -f *.a
        rm -f main

基本上,您的问题是C中多个文件开发的示例。

  • 如果您发布了make install命令,则Makefile将使用标准GCC编译过程编译您的程序。
  • 如果您发布了make ar,则汇编为ar包装合规性。
  • 如果您发布了make cleanMakefile将清洁您以前的构建

相关内容

最新更新