我必须按顺序编译这些文件:第一个然后是b因为其他要求。
现在文件是这种形式: A.H
void caller_func(void);
交流转换器
#include "a.h" #include "b.h" void caller_func(void){ called_func(void); }
b.h
void called_func(void);
b.c
#include "b.h" void called_func(void){ //any action }
在编译时我得到了 a.so:对'called_function'的未定义引用
无论如何都要绕过这个(除了改变编译顺序)?
答案 0 :(得分:2)
编写的代码应该没有问题。 然而,你必须确保你将a.c编译成a.o而将b.c编译成b.o 并链接它们。
您的编译行应如下所示:
gcc a.c b.c -o a.out
或者:
gcc -c a.c b.c
ld -o a.out a.o b.o
在第一个示例中,gcc将在后台调用ld以链接可执行文件。在第二个示例中,您将明确执行编译和链接步骤。
答案 1 :(得分:1)
我必须按顺序编译这些文件:第一个然后是b因为其他要求。
不,你没有这个要求。这两个模块之间没有任何共同点。
如果其中一个模块包含在库中,您可能需要以正确的顺序链接。但我认为这不是问题所在。
另一个提示:如果两者相同,那么在此定义之前包含声明并不重要!
你要做的很简单:编译&链接在一个阶段,如
gcc a.c b.c -o prog
或分两步编译(顺序无关紧要)
gcc a.c -c
gcc b.c -c
gcc a.o b.o -o prog
所有这一切都取决于你在Linux上采用gcc。但是大多数其他编译器的行为方式都是一样的。随意询问特殊的编译器或环境或操作系统。
答案 2 :(得分:1)
"未定义参考' called_function'"表示链接器无法找到编译b.c
生成的机器代码;要么您没有编译该文件,要么编译它所生成的目标代码不包含在最终链接命令中。
假设gcc,您可以执行类似
的操作gcc -c a.c # compiles a.c, generates object file a.o
gcc -c b.c # compiles b.c, generates object file b.o
gcc -o prog a.o b.o # links the object files into an executable named prog
听起来你已经写了像
这样的东西gcc a.c
编译a.c,然后尝试将其链接到可执行文件(默认名称a.out
或a.exe
,具体取决于您的平台)。