我有一个小的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
在某些情况下被激活。
所以我的问题是:
答案 0 :(得分:6)
嗯,我几乎肯定是因为某处发生了这种情况:
#define DrawText DrawTextA
为什么呢?因为后缀A
通常意味着“ascii”与后缀W
相对,这意味着“宽”(通常用于unicode)。这是Windows代码中的常见做法,通过简单的定义开关来统一ascii和unicode构建。
此外,Windows库中似乎存在这些功能:http://msdn.microsoft.com/en-us/library/ms901121.aspx。 windows.h
是否包含在您的项目中?
答案 1 :(得分:4)
您包含了windows.h,DrawText宏将DrawText替换为DrawTextA。
除了避免使用Windows也使用的名称之外,您无法做很多其他事情。不太吸引人。