为什么Mingw在编译时更改了我的标识符名称?

时间:2011-11-08 22:38:18

标签: c++ mingw

我有一个小的C ++库,可以在Linux上编译(这是我的主要开发平台)。现在我正在尝试使用Mingw在Windows机器(XP3)上构建它,并且由于无法解释的错误,编译失败。 例如,假设我在类AAA中有以下方法,在文件名aaa.h中声明的名称空间aaa中:

void AAA::DrawText( foo z );

编译文件aaa.cpp(当然包含方法实现)时,我收到以下错误:

D:\dev\[...]\aaa.cpp:644: error: no 'void aaa::AAA::DrawTextA( foo z )' member function declared in class 'aaa::AAA'

是的,你得到了它,没有错误 ...编译器误读某种程度上的函数名称,并在函数标识符中添加了一个字母!!! p>

这绝对不是我的理解。在Linux上从未遇到过这样的问题。 mingw / Gcc 如何更改标识符?

姓名错误?不,这在编译后会发生。

我当然检查了确切的命令行(我使用的是IDE):没有错:

mingw32-g++.exe -W  -O3 -Wall    -I..\include -I"C:\program files\OpenCV2.1\include\opencv"  -c D:\dev\...\aaa.cpp -o ..\obj\Release\src\aaa.o

但是:如果我将函数重命名为DrawTxt(),那么一切都很顺利(但我不能这样做)。这对我来说意味着标识符已经定义某处。 Opencv lib?掠过树,什么也没找到......是的,我还搜索了当前的包含文件夹,没有任何关闭。

我看到的另一个解决方案是某处(?)宏像:

#define DrawText DrawTextA

在某些情况下被激活。

所以我的问题是:

  • 我的代码中是否还有其他可能的名称替换?对我来说,宏是唯一的方法,如果标识符已在其他地方声明,它只会抛出错误,编译器不能(以及......)中断地更改/替换/编辑标识符
  • 如何追踪问题?

2 个答案:

答案 0 :(得分:6)

嗯,我几乎肯定是因为某处发生了这种情况:

#define DrawText DrawTextA

为什么呢?因为后缀A通常意味着“ascii”与后缀W相对,这意味着“宽”(通常用于unicode)。这是Windows代码中的常见做法,通过简单的定义开关来统一ascii和unicode构建。

此外,Windows库中似乎存在这些功能:http://msdn.microsoft.com/en-us/library/ms901121.aspxwindows.h是否包含在您的项目中?

答案 1 :(得分:4)

您包含了windows.h,DrawText宏将DrawText替换为DrawTextA。

除了避免使用Windows也使用的名称之外,您无法做很多其他事情。不太吸引人。