如何解决即使定义了我正在使用的命令,为什么仍得到对另一个文件的未定义引用?
我正在使用C进行项目,尽管大约一年都没有用C进行编码,并且我相信我只是在犯一个简单的错误,但是我不确定我应该为谷歌提供什么帮助我出去,所以我决定来这里。我有一个名为driver.c的简单文件,其内容如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include "printHello.h"
#define MAXLINE 4096
int main(int argc,char **argv)
{
char bfr[MAXLINE];
fputs("$ ",stderr);
while (fgets(bfr,MAXLINE,stdin) != NULL)
{
bfr[strlen(bfr) - 1] = '\0'; //replaces newline with NULL term. char
if (bfr[0] != '\0')
{
printHello();
//parseCommand(bfr); - this will be used eventually but tested with printHello()
}
fputs("$ ",stderr);
}
exit(0);
}
现在,当我使用make或仅在命令行上使用gcc进行编译时,我在MacBook上收到以下错误:
Undefined symbols for architecture x86_64:
"_printHello",referenced from:
_main in driver-5776c5.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
在Red Hat Linux计算机上出现此错误:
driver.o: In function `main':
driver.c:(.text+0x3c): undefined reference to `printHello'
collect2: error: ld returned 1 exit status
make: *** [driver] Error 1
现在,看起来好像printHello不存在,但是两者都存在
printHello.h:
void printHello();
和printHello.c:
#include <stdio.h>
void printHello(){
printf("hello");
}
有人知道为什么会这样吗?我在这个项目上有很多工作要做,所有的工作都相当容易,但是直到我可以简单地运行我的程序,我才能继续。
注意:每当我使用make进行编译时,都会创建一个名为“ -Wno-objc-signed-char-bool-implicit-int-conversion”的文件
我的make文件如下:
#Define the gcc options
CFLAGS = -Wall -std=c99
#Define the names of the object modules
OBJS = printHello.o driver.o
#Define a pattern for building an object file from a C file. Note: The
#variable $< expands to the name of the first prerequisite.
%.o : %.c
gcc $(CFLAGS) -c -o $@ $<
#Define the default rule
all: driver
#Define a rule for building the executable. Note: Unlike $?,the $^ variable
#expands to all the prerequisites required to build the target.
driver: driver.o
gcc -o $@ $^
#Define a rule to clean-up the mess. Note: Projects don't agree on whether
#to delete the library. The rule below deletes it.
clean:
rm -f *.o *.a driver *~
任何帮助将不胜感激,照常,如果您需要更多信息,请告诉我!
解决方法
在生成文件中用driver: driver.o
替换driver: ${OBJS}
为了使可执行文件依赖于所有目标文件(.o)
目前,makefile告诉您仅需要driver.o
来构建driver
,因此链接中缺少某些功能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。