【发布时间】:2013-01-29 21:12:49
【问题描述】:
我的设置是这样的:
src/
dir1/
header.h
dir11
(several files, every including header.h)
dir2/
(and so on)
但是链接器告诉我undefined reference to (the function which is defined in the subdir "dir11")。标题如下所示:
#ifndef header_h
#define header_h
/* some includes, all protected via ifndef-define-endif */
/* function prototypes for all functions in the 'dir11' subdir */
#endif // header_h
生成文件:
# some variables are defined before...
TARGET=mytarget
SOURCES= ${shell find ${SRC} -type f -name '*.c'}
OBJECTS=${foreach x, $(basename $(SOURCES)), $(x).o}
compile: ${OBJECTS}
%.o: %.c
${CC} -c ${CFLAGS} ${HEADERS} $^ -o $@
link:
${LD} ${OBJECTS} -o ${TARGET}
如何解决这个问题?为子目录中的每个文件编写标头是我想要走的最后一条路,因为其中有大约 50 个文件!
编辑:
也许这很有用:header.h 也包含在其他地方以调用函数!当包含 elsewere 时,我是否必须将此函数声明为 extern?
【问题讨论】:
-
"未定义的引用"... 什么?我希望那是一个错字,你的意思是
#ifndef在那个头文件的顶部。#ifdef会有点毫无意义(并且会阻止任何内容包含在其中)。 -
你的包含保护错了吗?不应该是
#ifndef header_h吗? -
嗯,是的,这是一个错字。对函数的未定义引用,这些函数在子目录的
.c文件中定义。 (我将在问题帖子中对此进行编辑!) -
所以它是一个未定义的引用,而不是链接处的未已解决引用?如果在编译时,您 not 会遇到 cannot-find-include-file "blah" 编译错误吗?另外,神奇的 ${HEADERS} 宏扩展成什么?
-
标头宏扩展为
-I./src。编译工作没有错误(除了一些 -Wunused-function 警告)!