2011-11-27 72 views
1

header.h声明的函数原型void InitializeTestData();为什么NetBeans测试代码不能正确链接?

a.c声明它void InitializeTestData() { ... }

b.c称之为InitializeTestData();

与海合会链接器将报告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

+1

你如何编译/链接你的程序? – codaddict

+0

+1好问题。 Netbeans处理它,并且与其他十几个具有外部功能和数据的文件没有问题。 – Mawg

+0

如果您创建了一个新的Netbeans项目,并且只复制并粘贴了您在该项目中显示的代码,那么您是否仍然遇到同样的错误? – zwol

回答

3

您是否将a.ob.o联系起来?很可能你不是。

+0

+1我会这么认为 - 除了Netbeans应该照顾这个。 – Mawg

+1

你的期望很明显不正确。看看失败的链接。它非常不可能有它。请用*实际*失败​​的链接线更新您的问题。 –

+0

D'oh!解决方案的问题(顺便说一下,这是复制/粘贴失败的链接器行) – Mawg

1

错误来自链接器,它表示b.o中函数InitializeTestData的引用未解析。

原因是你不喜欢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 
+0

+1我没有说这是一个Netbeans项目,所以应由IDE – Mawg

1

东西在呼唤_InitalizeTestData(注意下划线),但你也许并不在任何文件中定义它。你能否在错误的地方加上一个下划线,忘记执行该内容?

+0

+1负责处理,但iirc,Linker在重新解析外部数据前加上下划线 – Mawg

+0

我刚刚在gcc 4.4.4上测试了这个;没有下划线 – Dave

+0

一些ABI在C语言中定义的每个符号的开头都用下划线表示,有些则没有。例如,OSX和Linux没有。 – zwol

相关问题