gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:51 26 4
gpt4 key购买 nike

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

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'

是的,你明白了,那里没有拼写错误...编译器以某种方式误读函数名称,并在函数标识符中添加了一个字母!!!

这完全不在我的理解范围之内。在 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 库? Grepped the tree,什么也没找到...是的,我还搜索了当前的包含文件夹,什么都没有。

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

#define DrawText DrawTextA

在某些情况下会被激活。

所以我的问题是:

  • 在我的代码中是否还有其他可能替换这个奇怪的名称?对我来说,宏是唯一的方法,如果标识符已经在别处声明,它只会抛出一个错误,编译器不能(好吧...)突然更改/替换/编辑标识符.
  • 我怎样才能找到问题所在?

最佳答案

好吧,我几乎可以肯定这是因为某处发生了这种情况:

#define DrawText DrawTextA

为什么?因为后缀 A 通常表示“ascii”,而后缀 W 表示“宽”(通常用于 unicode)。这是 Windows 代码中使用简单定义开关统一 ascii 和 unicode 构建的常见做法。

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

关于c++ - 为什么 Mingw 在编译时更改我的标识符名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8058061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com