为什么我得到了对另一个文件的未定义引用,即使我定义了我正在使用的命令?
Why am I getting an undefined reference to another file, even though I define the command I am using?
我正在用 C 开发一个项目,尽管我已经大约一年没有用 C 编写代码了,我相信我犯了一个简单的错误,但我什至不确定我应该做什么 google 来帮助我,所以我决定来这里。我有一个名为 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] = '[=10=]'; //replaces newline with NULL term. char
if (bfr[0] != '[=10=]')
{
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)
在红帽 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 *~
如有任何帮助,我们将不胜感激,和往常一样,如果您需要更多信息,请告诉我!
在您的 makefile 中将 driver: driver.o
替换为 driver: ${OBJS}
为了使可执行文件依赖于所有目标文件 (.o)
现在 makefile 告诉我们只需要 driver.o
构建 driver
,因此 link.
中缺少某些功能
我正在用 C 开发一个项目,尽管我已经大约一年没有用 C 编写代码了,我相信我犯了一个简单的错误,但我什至不确定我应该做什么 google 来帮助我,所以我决定来这里。我有一个名为 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] = '[=10=]'; //replaces newline with NULL term. char
if (bfr[0] != '[=10=]')
{
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)
在红帽 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 *~
如有任何帮助,我们将不胜感激,和往常一样,如果您需要更多信息,请告诉我!
在您的 makefile 中将 driver: driver.o
替换为 driver: ${OBJS}
为了使可执行文件依赖于所有目标文件 (.o)
现在 makefile 告诉我们只需要 driver.o
构建 driver
,因此 link.