为什么mingw32和tdm-gcc64使用外部gcc表现不同

时间:2014-03-13 22:08:22

标签: haskell gcc wxwidgets wxhaskell

我正在尝试cabal install wxHaskell的一个组件(针对wxWidgets 3.0的Haskell平台2013.2)。 我能够从mingw.org编译32位mingw的git版本。但最终,安装的wx无法正常运行,并且运行最小示例会在wxc.dll中提供运行时异常。所以我尝试在TDM-GCC 4.8.1 64bit下编译相同的东西,因为wxWidgets人们以TDM-GCC编译的二进制文件的形式提供它们的二进制文件。

但是我立刻遇到了TDM-GCC的编译错误,告诉我

错误:'strnlen'未在此范围内声明

令我惊讶的是,尽管mingw32和TDM-gcc都使用了来自Haskell Platform c:\HaskellPlatform\2013.2.0.0\mingw\bin\gcc.exe的相同外部gcc,但是在另一个编译正常的情况下会出错。

导致问题的第一个文件是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,但它不会改变任何内容。

仅供参考,我使用

分别从mingw和tdm-gcc版本的源代码编译了wxWidgets 3.0.0。
./configure --enable-stl && make && make install

如果需要,我可以提供更多详细信息。

1 个答案:

答案 0 :(得分:-1)

首先,wxWidgets确实可以与MinGW一起使用,事实上只提供TDM二进制文件意味着有人自愿提供后者但不提供前者。但MinGW的所有三个流行版本(已经提到的两个版本和MinGW-W64)都可以工作,所以构建一定有问题......

然而,虽然它们都有效,但它们肯定是不同的编译器,所以你的意思是它们都使用相同的gcc二进制文件?它必须是MinGW或TDM,但它不能同时出现。

配置检测到用于大文件支持的不同标志也非常可疑。看看config.log,肯定会出现问题,并且在初始阶段肯定会出现一些错误。