Почему Mingw меняет имя моего идентификатора во время компиляции? - PullRequest
4 голосов
/ 09 ноября 2011

У меня небольшая библиотека C ++, прекрасно компилируется в Linux (которая является моей основной платформой для разработчиков). Сейчас я пытаюсь собрать его на Windows-машине (XP3) с Mingw, и компиляция не удалась из-за необъяснимой ошибки. Например, скажем, у меня есть следующий метод в классе 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 lib? Grepped дерево, ничего не нашел ... И да, я искал также текущую папку include, ничего не закрывать.

Другое решение, которое я вижу, состоит в том, что где-то есть (?) Макрос вроде:

#define DrawText DrawTextA

, который активируется в некоторой ситуации.

Итак, мои вопросы:

  • Есть ли другие возможности для замены этого любопытного имени в моем коде? Для меня макрос - единственный способ, если идентификатор уже был объявлен в другом месте, он просто выдаст ошибку, компилятор не сможет (ну ...) резко изменить / заменить / отредактировать идентификатор.
  • Как я могу отследить проблему?

Ответы [ 2 ]

6 голосов
/ 09 ноября 2011

Ну, я почти уверен, что это потому, что где-то это происходит:

#define DrawText DrawTextA

Почему? Поскольку суффикс A часто означает «ascii», в отличие от суффикса W, что означает «широкий» (часто для Unicode). Это обычная практика в коде Windows для объединения сборок ascii и unicode с помощью простого переключателя define.

Кроме того, похоже, что функции существуют в библиотеке Windows: http://msdn.microsoft.com/en-us/library/ms901121.aspx. Включено ли windows.h в ваш проект?

4 голосов
/ 09 ноября 2011

Вы включили windows.h, а макрос DrawText заменил DrawText на DrawTextA.

С этим можно многое сделать, кроме как избегать использования имен, которые также использует Windows.Не очень привлекательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...