我实际上是在尝试从另一个函数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.c
,b.c
和main.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 clean
,Makefile
将清洁您以前的构建