如何在c中使用头文件

时间:2013-11-12 11:22:42

标签: c gcc header

我在MyStrLen.c类中定义了一个方法并实现了它,我在头文件MyStrLen.h中为它声明了,我想要的是在另一个类MyStrCmp.c中使用MyStrLen中的方法 但是当我尝试制作o文件时,它会在shell中显示编译错误。

MyStr.h

  int inputLen(char* myStr);

MyStr.c

int inputLen(char* myStr)
{
  ....
  ....
}

MyStrCmp.c

 #include "MyStr"
void method()
{
 inputLen(someinput)
}

这是编译错误

MyStrCmp.c :(。text + 0x18):对inputLen' MyStrCmp.c:(.text+0x29): undefined reference to inputLen'的未定义引用 MyStrCmp.c :(。text + 0x55):未定义引用inputLen' MyStrCmp.c:(.text+0x77): undefined reference to inputLen'

4 个答案:

答案 0 :(得分:2)

是的,基本清单如下:

  • MyStrCmp.c是否包含MyStr.h文件:#include "MyStr.h"应位于文件的顶部(#include <stdio.h>#include <stdlib.h>旁边)
  • MyStr.c是否也这样做?我的意思是包括它自己的头文件(#include "MyStr.h"
  • 提及的3个文件(MyStrCmp.cMyStr.cMyStr.h)是否在同一目录中?
  • 您是否将MyStrCmp.c文件和MyStr.c文件同时传递给gcc?

如果对所有这四个问题的答案都是肯定的,那么:

$ gcc -o MyStrCmp -Wall MyStrCmp.c MyStr.c -std=c99

应该有效。由于您编写inputLen函数的方式(在MyStr.c中),它被编写为可以在外部编译或分开编译(gcc -o MyStr.c)的文件,以生成o文件)。因此,必须通过将两个源文件传递给编译器来显式地完成链接。顺便说一句,更多细节可以在this duplicate question中找到 基本上,打开终端窗口,然后输入以下命令:

$ mkdir test
$ cd test/
$ touch MyStr.c && touch MyStr.h && touch MyStrCmp.c
$ vim MyStr.c MyStr.h -O

我使用Vim,你可以使用你喜欢的编辑器,但除此之外 在MyStr.h文件中,键入:

int inputLen(char* myStr);

保存并关闭它,然后编辑MyStr.c文件,并定义您的实际功能:

#include "MyStr.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int inputLen(char *myStr)
{
    printf("%s\n", myStr);
    return strlen(myStr);
}

保存&amp;关闭,然后编辑MyStrCmp.c文件,并编写如下内容:

#include <stdio.h>
#include <stdlib.h>
#include "MyStr.h"
int main(int argc, char **argv )
{
    const char *test = "Some test-string";
    int l = 0;
    l = inputLen(test);
    printf("The printed string is %d long\n", l);
    return EXIT_SUCCESS;
}

然后使用我在上面提供的命令进行编译。这对我来说很好......

答案 1 :(得分:1)

MyStrCmp.c中,将其放在顶部:

#include "MyStr.h"

答案 2 :(得分:1)

你的“MyStr.h”应该有: extern int inputLen(char* myStr);

和你的“MyStr.c” 应该有#include<MyStr.h> 你的MyStrCmp.c也应该有#include<MyStr.h>

前提是所有标题和来源都在同一个目录中!

避免多次包含混淆:使用标题保护

#ifndef MYSTR_H
#define MYSTR_H

extern int inputLen(char* myStr);

#endif

答案 3 :(得分:0)

答案可能是您没有使用正确的编译命令。

你必须使用-c标志(如果你使用的是gcc)来创建.o文件,否则gcc会尝试链接可执行文件而不知道MyStr.c它将无法找到inputLen函数。

尝试使用-c分别编译Mystr.c和MyStrCmp.c然后链接.o文件。

您在评论中提到您“已编译它”,但您必须确保链接器合并这两个文件。