函数声明和未解析的外部

时间:2009-10-01 08:31:00

标签: c++ visual-studio-2008 linker c-preprocessor porting

我正在寻找一个庞大的旧 C 程序并将其转换为C ++(我是新手)。

有许多复杂的预处理器黑客正在进行连接,因为程序必须在许多不同配置的许多不同平台上运行。

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

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

现在链接器抱怨:

  

functionA是一个未解析的外部符号。

我怀疑问题是file1.c中的原型与file2.c中看到的函数的真实定义略有不同。

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

有没有办法显示完全编译器认为functionA()的类型file1.c而不是file2.c

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你真的必须将所有现有的C代码转换为C ++吗?这可能是很多工作,尤其是考虑到你到目前为止所描述的内容。

相反,您可以使用extern "C"在C ++中编写新代码并调用C代码。例如,在C ++源文件中,您可以:

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

这改变了链接,因此C ++编译器生成对C代码的外部引用而没有名称错位,允许链接器匹配所有内容。

答案 2 :(得分:0)

通常你应该在输出中有预期的和实际的签名。

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