所以我有三个文件:
log.c : defines all the functions
log.h : lists all the functions
main.c. : uses the functions
现在,log.c
和main.c
都有log.h
标题。
gcc log.c main.c
以上运行正常,没有错误。但是,当我尝试在this教程后创建一个Makefile时,我有:
CC=gcc
CFLAGS=-I
log: main.o log.o
$(CC) -o log main.o log.o -I
当我运行make
时,每次main
调用log.c
中定义的函数时都会显示错误,说“未定义对(函数)的引用”。
对此有任何帮助将不胜感激。
-bash-4.2$ make
gcc -I -c -o main.o main.c
/tmp/ccQOC7wH.o: In function `main':
main.c:(.text+0x11): undefined reference to `getlog'
main.c:(.text+0x6f): undefined reference to `buildmsg'
main.c:(.text+0x7b): undefined reference to `savelog'
main.c:(.text+0x109): undefined reference to `buildmsg'
main.c:(.text+0x19a): undefined reference to `buildmsg'
main.c:(.text+0x207): undefined reference to `getlog'
main.c:(.text+0x223): undefined reference to `savelog'
main.c:(.text+0x247): undefined reference to `buildmsg'
main.c:(.text+0x24c): undefined reference to `getlog'
main.c:(.text+0x268): undefined reference to `savelog'
main.c:(.text+0x279): undefined reference to `clearlog'
collect2: error: ld returned 1 exit status
答案 0 :(得分:3)
您没有为I
选项指定include目录,因此在编译阶段GCC实际上将-c
解释为include目录,该目录取消了仅编译标志,然后尝试链接你的程序。
你不需要include标志,甚至不需要链接的配方因为你的文件布局与内置规则匹配,你的整个Makefile(假设cc
是你默认编译器的链接)可以只是
log: log.o main.o
答案 1 :(得分:0)
当您运行包含-I
而不是-I.
的makefile时,您创建了无效的main.o
。您需要将-I.
重新放回该目录中的CFLAGS
和rm *.o
。那就应该好了。