Почему mingw32 и tdm-gcc64 ведут себя по-разному при использовании внешнего gcc
Я пытаюсь cabal install
компонент wxHaskell (платформа Haskell 2013.2 против wxWidgets 3.0). Мне удалось скомпилировать git-версию с 32-битным mingw с mingw.org. Но, в конце концов, установленный wx не может работать правильно, и выполнение минимального примера дает исключения времени выполнения в wxc.dll. Поэтому я пытаюсь скомпилировать то же самое в 64-разрядной версии TDM-GCC 4.8.1, поскольку пользователи wxWidgets предоставляют свои двоичные файлы в виде скомпилированных двоичных файлов TDM-GCC.
Но я сразу же сталкиваюсь с ошибками компиляции с TDM-GCC, говоря мне
ошибка: 'strnlen' не был объявлен в этой области
Что меня удивляет, так это то, что mingw32 и TDM-gcc используют один и тот же внешний gcc из платформы Haskell. c:\HaskellPlatform\2013.2.0.0\mingw\bin\gcc.exe
один выдаст ошибку, в то время как другой скомпилируется нормально.
Первая проблема с файлом src\cpp\eljaccelerator.cpp
, Компилируется нормально под mingw32:
...
c:\HaskellPlatform\2013.2.0.0\mingw\bin\gcc.exe -Wl,--hash-size=31 -Wl,--reduce-
memory-overheads -Isrc/include -IC:/MinGW/msys/1.0/local/include/wx-3.0 -IC:/Min
GW/msys/1.0/local/lib/wx/include/msw-unicode-3.0 -D__WXMSW__ -DWXUSINGDLL -D_LAR
GEFILE_SOURCE=unknown -DwxcREFUSE_MEDIACTRL -DBUILD_DLL -c src\cpp\eljaccelerato
r.cpp -o dist\build\src/cpp/eljaccelerator.o
но выдает ошибку под TDM-gcc:
Building wxc
c:\HaskellPlatform\2013.2.0.0\mingw\bin\gcc.exe -Wl,--hash-size=31 -Wl,--reduce-
memory-overheads -Isrc/include -IC:/mingw/msys/1.0/local/include/wx-3.0 -IC:/min
gw/msys/1.0/local/lib/wx/include/msw-unicode-3.0 -D__WXMSW__ -DWXUSINGDLL -D_FIL
E_OFFSET_BITS=64 -DwxcREFUSE_MEDIACTRL -DBUILD_DLL -c src\cpp\eljaccelerator.cpp
-o dist\build\src/cpp/eljaccelerator.o
In file included from C:/mingw/msys/1.0/local/include/wx-3.0/wx/crt.h:19:0,
from C:/mingw/msys/1.0/local/include/wx-3.0/wx/string.h:4305,
from C:/mingw/msys/1.0/local/include/wx-3.0/wx/memory.h:15,
from C:/mingw/msys/1.0/local/include/wx-3.0/wx/object.h:19,
from C:/mingw/msys/1.0/local/include/wx-3.0/wx/wx.h:15,
from src/include/wrapper.h:20,
from src\cpp\eljaccelerator.cpp:1:
C:/mingw/msys/1.0/local/include/wx-3.0/wx/wxcrt.h: In function 'size_t wxStrnlen
(const char*, size_t)':
C:/mingw/msys/1.0/local/include/wx-3.0/wx/wxcrt.h:173:92: error: 'strnlen' was n
ot declared in this scope
C:/mingw/msys/1.0/local/include/wx-3.0/wx/wxcrt.h: In function 'size_t wxStrnlen
(const wchar_t*, size_t)':
C:/mingw/msys/1.0/local/include/wx-3.0/wx/wxcrt.h:187:95: error: 'wcsnlen' was n
ot declared in this scope
Failed to install wxc-0.90.1.1
Мне было интересно, если у кого-нибудь есть подобный опыт. Есть идеи, что пошло не так и как исправить компиляцию для TDM-GCC? Я пытался добавить #include <cstring>
в wxcrt.h
но это ничего не меняет.
К вашему сведению, я скомпилировал wxWidgets 3.0.0 из исходного кода в версиях mingw и tdm-gcc соответственно, используя
./configure --enable-stl && make && make install
Я могу предоставить более подробную информацию, если это необходимо.
1 ответ
Прежде всего, wxWidgets, безусловно, работает с MinGW, тот факт, что предоставляются только двоичные файлы TDM, просто означает, что кто-то вызвался предоставить последнее, но не первое. Но все три популярные версии MinGW (две уже упомянутые и MinGW-w64) работают, поэтому в сборке должно быть что-то не так...
Однако, хотя все они работают, они, безусловно, являются разными компиляторами, так что вы имеете в виду, что они оба используют один и тот же двоичный файл gcc? Это должен быть MinGW или TDM, но это не может быть одновременно.
Также очень подозрительно, что configure обнаруживает различные флаги для поддержки больших файлов. смотреть на config.log
должно быть, что-то пошло не так, и на начальном этапе в нем должны быть какие-то ошибки.