在编译之前使用函数

时间:2014-07-10 21:27:45

标签: c compilation

我必须按顺序编译这些文件:第一个然后是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'的未定义引用

无论如何都要绕过这个(除了改变编译顺序)?

3 个答案:

答案 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.outa.exe,具体取决于您的平台)。