为什么此NetBeans测试代码不能正确链接?

时间:2011-11-27 06:31:36

标签: c gcc netbeans linker

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

3 个答案:

答案 0 :(得分:3)

您是否将a.ob.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(注意下划线),但你可能没有在任何一个文件中定义它。您是否可能错误地将下划线放在某处,忘记执行该操作?