将程序与两个静态库链接,每个静态库都包含依赖于另一个函数的函数?
Linking a program with two static libraries each containing functions that depend on functions in the other?
我实际上是在尝试从另一个函数 b
(存储在 libb.a)中调用一个函数 a
(存储在 liba.a),但我有一个链接错误。
有我的文件:
a.c
#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 代码没有演示)。
在已有 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
将清除您之前的构建
EDIT: It appears that library order in the command line matters. But in my real problem libA depends on libB and libB depends on libA (which the MCVE code doesn't demonstrate).
那么,你真正的问题是你把自己画在了角落里。正确的做法是安排两个库,使一个完全独立于另一个,然后在 link 命令中一个接一个地放置。
如果不进行更改,您可能会两次提及第一个库,
gcc main.c liba.a libb.a liba.a
linker 在名称解析方面非常简单。从未解析的名称列表开始,它遍历库列表,在找到它们时解析名称。它不会注意到你给它 liba.a 两次;它将解析 b
提供的 a
个名称,然后是 a
提供的 b
个名称。
但这一招很可能有一天会咬你一口(如果它能奏效的话)。正如我所说,最好的办法是理清你的依赖关系,为你自己和追随你的人简化事情。
我实际上是在尝试从另一个函数 b
(存储在 libb.a)中调用一个函数 a
(存储在 liba.a),但我有一个链接错误。
有我的文件:
a.c
#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 代码没有演示)。
在已有 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
将清除您之前的构建
EDIT: It appears that library order in the command line matters. But in my real problem libA depends on libB and libB depends on libA (which the MCVE code doesn't demonstrate).
那么,你真正的问题是你把自己画在了角落里。正确的做法是安排两个库,使一个完全独立于另一个,然后在 link 命令中一个接一个地放置。
如果不进行更改,您可能会两次提及第一个库,
gcc main.c liba.a libb.a liba.a
linker 在名称解析方面非常简单。从未解析的名称列表开始,它遍历库列表,在找到它们时解析名称。它不会注意到你给它 liba.a 两次;它将解析 b
提供的 a
个名称,然后是 a
提供的 b
个名称。
但这一招很可能有一天会咬你一口(如果它能奏效的话)。正如我所说,最好的办法是理清你的依赖关系,为你自己和追随你的人简化事情。