У меня небольшая библиотека 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
, который активируется в некоторой ситуации.
Итак, мои вопросы:
- Есть ли другие возможности для замены этого любопытного имени в моем коде? Для меня макрос - единственный способ, если идентификатор уже был объявлен в другом месте, он просто выдаст ошибку, компилятор не сможет (ну ...) резко изменить / заменить / отредактировать идентификатор.
- Как я могу отследить проблему?