0

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

MyStr.h

  int inputLen(char* myStr);

我的Str.c

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

MyStrCmp.c

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

这是编译错误

MyStrCmp.c:(.text+0x18): undefined reference to inputLen' MyStrCmp.c:(.text+0x29): undefined reference toinputLen' MyStrCmp.c:(.text+0x55): undefined reference to inputLen' MyStrCmp.c:(.text+0x77): undefined reference toinputLen'

4

4 回答 4

2

对,基本清单如下:

  • 是否MyStrCmp.c包含MyStr.h文件:#include "MyStr.h"应该在文件的顶部(和#include <stdio.h>旁边#include <stdlib.h>
  • MyStr.c同样的事情吗?我的意思是包含它自己的头文件(#include "MyStr.h"
  • 提到的 3 个文件( 和 )是否MyStrCmp.cMyStr.c同一MyStr.h目录中?
  • 您是否将MyStrCmp.c文件和MyStr.c文件都传递给gcc?

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

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

应该管用。由于您编写inputLen函数的方式 (in MyStr.c),它被编写为可以在外部编译的文件,或者单独编译 ( gcc -o MyStr.c,以生成 o 文件)。因此,必须通过将两个源文件都传递给编译器来显式完成链接。顺便说一句,可以在这个重复的问题
中找到更多详细信息。 基本上,打开一个终端窗口,然后输入以下命令:

$ 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);
}

保存并关闭,然后编辑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;
}

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

于 2013-11-12T12:15:12.487 回答
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
于 2013-11-12T12:18:14.117 回答
1

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

#include "MyStr.h"
于 2013-11-12T11:26:44.003 回答
0

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

您必须使用 -c 标志(如果您使用 gcc)来创建 .o 文件,否则 gcc 将尝试链接可执行文件并且在不知道 MyStr.c 的情况下将无法找到 inputLen 函数。

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

您在评论中提到您“确实编译了它”,但您必须确保链接器将这两个文件组合在一起。

于 2013-11-12T12:26:34.973 回答