2013-06-19 8 views
0

Платформа: Windows XP; MingGW с (gcc v.4.7.2)Как вызвать MinGW для ссылки «msvcr100.dll» вместо «msvcr.dll» в «libstdC++. Dll» и «libgcc_s_dw2-1.dll»?

Как указано в теме, как я могу добиться этого?

Почему? Я определяю крах моего многопоточного приложения на Windowx XP, если я скомпилирую приложение с MinGW. Согласно обратному сигналу приложение выходит из строя в функции «setlocale», которая встроена в «msvcrt.dll».

Я попытался скомпилировать мое приложение с 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 связать против "msvcr100.dll" в "libstdC++ DLL." И "libgcc_s_dw2-1.dll".

Я уже адаптировались мой Spec-файл:

* libgcc:% {mthreads: -lmingwthrd} -lmingw32% {разделяемой libgcc: -lgcc_s}% {разделяемой libgcc: - lgcc_eh} -lgcc -lmoldname -lmingwex -lmsvcr100

Но это не помогает, как упоминалось длл все еще связаны в DLL файлы указано. Просто взгляните на вложенной картинке:

enter image description here

Благодаря до сих пор!

Br

ответ

1

Так что мой вопрос, как вызвать MinGW связать против "msvcr100.dll" в "libstdC++. DLL" и "libgcc_s_dw2-1.dll"

Эти библиотеки поставляются и создаются MinGW, они не построены как часть вашей собственной сборки приложения. Таким образом, вам нужно будет сначала собрать эти два libs из источника, чтобы они могли ссылаться на msvcr100.dll

Но то, что вы действительно должны делать, это связывать ваше приложение статически с этими двумя библиотеками и устранять зависимости dll. Например, в вашем configure.ac вы можете использовать:

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

я до сих пор сомневаюсь, что ваша конкретная авария вызвана этим. Многие dll зависят от msvcrt; просто разверните файл WS2_32.dll, например.

Кстати, ваша специальная спецификация должна использовать -lmoldname100