header.h
声明函数原型void InitializeTestData();
a.c
声明void InitializeTestData() { ... }
b.c
将其称为InitializeTestData();
并且GCC链接器报告b.c:108: undefined reference to '_InitializeTestData'
我必须忽略一些明显的东西,但是什么呢?
header.h
确实有一个包含保护(其#define
仅在该文件中使用)。
没有涉及其他预处理程序指令......没有#if
包围原型或声明。
如果我不必发布整个项目,有人可以建议让我说d'oh!
吗?
更新:Netbeans处理它,并且对其他十几个带有外部函数和数据的文件没有任何问题。
回答:a.c
实际上是一个NetBeans测试文件。 NetBeans处理这些与其他文件不同,因为它们每个都需要amain()
。这意味着他们每个人都有自己的Makefile,b.o
没有与该文件中的a.o
链接。解决方案,将声明移动到不是Netbeans测试文件的文件c.c
。
答案 0 :(得分:3)
您是否将a.o
与b.o
相关联?很可能你不是。
答案 1 :(得分:1)
错误来自链接器,这意味着InitializeTestData
中函数b.o
的引用未得到解决。
原因是你不喜欢a.o
(包含定义)b.o
。
你需要这样做:
# this will compile both the .c files and also link the resultant .o
gcc -o output a.c b.c
或
gcc -c a.c # get a.o
gcc -c b.c # get b.o
gcc -o output a.o b.o # link them
答案 2 :(得分:1)
有些东西在调用_InitalizeTestData
(注意下划线),但你可能没有在任何一个文件中定义它。您是否可能错误地将下划线放在某处,忘记执行该操作?