我在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'
答案 0 :(得分:2)
是的,基本清单如下:
MyStrCmp.c
是否包含MyStr.h
文件:#include "MyStr.h"
应位于文件的顶部(#include <stdio.h>
和#include <stdlib.h>
旁边)MyStr.c
是否也这样做?我的意思是包括它自己的头文件(#include "MyStr.h"
)MyStrCmp.c
,MyStr.c
和MyStr.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文件。
您在评论中提到您“已编译它”,但您必须确保链接器合并这两个文件。