0

平台:Windows XP;MingGW 与 (gcc v.4.7.2)

如主题所述,我怎样才能做到这一点?

为什么?我确定我的多线程应用程序在 Windowx XP 上崩溃,以防我使用 MinGW 编译应用程序。根据回溯,应用程序在“msvcrt.dll”中内置的“setlocale”函数中崩溃。

我尝试使用 Visual Studio 2010 编译我的应用程序,但我确定没有这样的崩溃,正如依赖项步行者所揭示的那样,“msvcr100.dll”已链接,并且可能包含更强大的“setlocale”版本功能。

这里是回溯:

ABoostLog.exe caused an Access Violation at location 77c03509 in module msvcrt.dll Reading from location 00000000.

Registers:
eax=00cdfb88 ebx=003d6afc ecx=003d6d24 edx=003d6d24 esi=00000758 edi=00000000
eip=7c91eb94 esp=00cdfb4c ebp=00cdfbb0 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246

Call stack:
7C91EB94 ntdll.dll:7C91EB94 KiFastSystemCallRet
7C802532 kernel32.dll:7C802532 WaitForSingleObject
0041E33D WithThread.exe:0041E33D
XXXXXXXXXXXXXXXXXXXXXX
Registers:
eax=77c2f94c ebx=77c2f94c ecx=00000000 edx=77c2f798 esi=77c2f79a edi=ffffffff
eip=77c03509 esp=0022f520 ebp=0022f534 iopl=0 nv up ei ng nz ac po cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000297

Call stack:
77C03509 msvcrt.dll:77C03509 unguarded_readlc_active_add_func
77C03C1B msvcrt.dll:77C03C1B
unguarded_readlc_active_add_func
77C03C60 msvcrt.dll:77C03C60 setlocale
6FC671D1 libstdc++-6.dll:6FC671D1 std::__timepunct::_M_put
6FC7A63C libstdc++-6.dll:6FC7A63C std::time_put > >::do_put
6FC7A4CA libstdc++-6.dll:6FC7A4CA std::time_put > >::put
004EE047 ABoostLog.exe:004EE047

所以我的问题是,如何触发 MinGW 链接到“libstdc++.dll”和“libgcc_s_dw2-1.dll”中的“msvcr100.dll”。

我已经将我的规范文件调整为:

*libgcc: %{mthreads:-lmingwthrd} -lmingw32 %{shared-libgcc:-lgcc_s} %{!shared-libgcc:-lgcc_eh} -lgcc -lmoldname -lmingwex -lmsvcr100

但这无济于事,因为提到的 dll 仍然在 dll 的声明中链接。看看嵌入的图片:

在此处输入图像描述

到目前为止感谢!

4

1 回答 1

2

所以我的问题是,如何触发 MinGW 链接到“libstdc++.dll”和“libgcc_s_dw2-1.dll”中的“msvcr100.dll”

这些库由 MinGW 提供和构建,它们不是作为您自己的应用程序构建的一部分构建的。因此,您首先需要自己从源代码构建这两个库,以使它们链接到 msvcr100.dll

但是您真正应该做的是将您的应用程序静态链接到这两个库并消除 dll 依赖项。例如,在您的 configure.ac 中,您可以使用:

CFLAGS="$CFLAGS --static -static-libgcc -static-libstdc++"
LDFLAGS="$LDFLAGS --static"

我仍然怀疑您的特定崩溃是由此引起的。许多 dll 依赖于 msvcrt;例如,只需扩展您的 WS2_32.dll。

顺便说一句,您的自定义规范应该使用-lmoldname100

于 2013-10-31T09:31:10.047 回答