即使定义了我正在使用的命令,为什么仍得到对另一个文件的未定义引用?

问题描述

我正在使用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,因此链接中缺少某些功能。