我用c语言创建了一个程序,第一次使用Visual Studio代码,头文件中的函数不起作用。这是我的主要代码:
#include <stdio.h>
#include "PilhaDinamica.h"
#include "PilhaEstatica.h"
int main()
{
Pilha *p = criaPilha();
return 0;
}
这是我的.h文件:
#ifndef PILHADINAMICA_H_INCLUDED
#define PILHADINAMICA_H_INCLUDED
typedef struct Nodo{
char info;
struct Nodo*prox;
} nodo;
typedef struct {
nodo * Topo;
} Pilha;
Pilha * criaPilha();
int pilha_vazia(Pilha *p);
void push(Pilha *p, char times);
char pop(Pilha *p);
#endif
这是我的功能文件:
#include "PilhaDinamica.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Pilha *criaPilha()
{
Pilha *p = (Pilha*) malloc(sizeof(Pilha));
p->Topo = NULL;
return p;
}
这显示在我的输出中:";。。。\AppData\Local\Temp\ccmjk1nS.o:main.c:(.text+0xf(:对"criaPilha"的未定义引用collect2.exe:错误:ld返回1退出状态">
我该怎么做才能使它正确编译?
根据一般经验,头文件(*.h(包含声明(类型、变量和函数声明(,源文件(*.c(包含这些声明的定义。
在编译步骤中,只编译源文件(因为存在定义(。一个程序或库的创建是一个2步过程(实际上更像预处理和更多,但为了简单起见,我们将其保持在2步(:
- 创建对象文件
例如gcc -c -o object_file_name.o source_file_name.c
- 将这些对象文件链接到可执行或静态/共享库中
例如gcc -o program_or_library_name object_file_1.o object_file_2.o ...
因此,在您的情况下,您必须为源文件调用编译器两次(使用-c标志(,并将创建的对象文件链接到可执行文件中一次。
注意:如果使用gcc
以外的其他编译器,请查看有关如何创建对象文件并将它们链接在一起的文档。