函数声明和一个无法解析的外部程序

问题描述:

我正在寻找一个庞大的旧的C程序并将其转换为C++(我是新来的)。函数声明和一个无法解析的外部程序

有很多复杂的预处理器黑客正在连接到这样一个事实,即该程序必须在许多不同的平台上以多种不同的配置运行。

在一个文件中(称为file1.c)我是致电functionA()
而在另一个文件中(称为file2.c)我有一个定义functionA()

不幸的是,函数的确切类型是由一系列以令人眼花缭乱的方式创建的宏指定的。

现在接头抱怨并:

泛函是一个未解决的外部符号。

我怀疑问题在于file1.c中的原型与file2.c中的函数的真正定义略有不同。

由于_cdeclfastcall之间以及有和没有__forceinline之间的不匹配,存在很大的细微差异范围。

是否有某种方式来显示究竟什么编译器认为是所看到file1.c,而不是file2.cfunctionA()类型?

您可以将一个标志传递给编译器(我认为是/ P),它会导致它输出传递给编译器的完整的预处理输出 - 然后可以打开这个(巨大)文件并搜索它并您需要的信息将在某处。

+0

+1。谢谢......这虽然有所帮助,但现在已经揭示了我在一个新问题中提出的更深奥的奥秘。 – Mick 2009-10-01 09:59:23

你真的必须将所有现有的C代码转换为C++吗?这可能是很多工作,尤其是考虑到你迄今为止描述的内容。您可以使用C++编写新代码并使用extern "C"调用C代码。例如,在C++源文件,您可以:

extern "C" { 
#include "old_c_header.h" 
} 

这改变了联动所以C++编译器没有名称重整生成的C代码外部引用,使链接到的一切相匹配。

+0

不幸的是,我必须将它转换为C++,原因很多,但是无论如何感谢提示。 – Mick 2009-10-01 08:38:54

通常情况下,您应该在输出中具有预期签名和实际签名。

否则,您可以指示编译器将预处理结果输出到单独的文件中,cl.exe /p用于MSVC和gcc gcc -E

+0

链接器报告它无法找到的函数的精确声明,大概是与file1.c对应的函数,但我不知道与file2.c对应的函数。 – Mick 2009-10-01 08:44:15

+0

太糟糕了,我希望预处理器输出和grep /搜索函数名称有所帮助。 – 2009-10-01 08:48:51