将程序与两个静态库链接,每个静态库包含依赖于另一个函数的函数?

时间:2016-12-03 18:36:14

标签: c static-libraries

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

有我的档案:

交流转换器

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

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代码没有证明)。

2 个答案:

答案 0 :(得分:1)

  

编辑:看来命令行中的库顺序很重要。但在我的实际问题中,libA依赖于libB,而libB依赖于libA(MCVE代码没有证明)。

那么,你真正的问题是,你已经把自己画在了角落里。正确的做法是安排两个库,使一个完全独立于另一个库,并将其一个接一个地放在link命令中。

如果没有做出这样的改变,你可能会两次提到第一个图书馆,

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

在名称解析方面,链接器非常简单。从未解析的名称列表开始,它会遍历库列表,在找到它们时解析名称。它没有注意到你给它两次liba.a;它将解析a提供的b名称,然后解析b提供的a名称。

但是这一招很可能会让你有一天(如果它有效)。正如我所说,最好是为自己和那些关注你的人整理你的依赖关系并简化事情。

答案 1 :(得分:-1)

在您已拥有Makefilea.cb.c的同一目录中创建以下main.c

#!/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将清除之前的版本