我实际上试图从另一个函数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代码没有证明)。
答案 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)
在您已拥有Makefile
,a.c
和b.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 clean
,Makefile
将清除之前的版本