2013-06-19 54 views
0

平臺:Windows XP; MingGW with(gcc v.4.7.2)如何觸發MinGW鏈接「msvcr100.dll」而不是「libstdC++。dll」和「libgcc_s_dw2-1.dll」內的「msvcr.dll」?

正如主題中所述,我該如何實現這一目標?

爲什麼?我確定我的多線程應用程序在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%{共享libgcc中:-lgcc_s}%{共享libgcc中:! - lgcc_eh} -lgcc -lmoldname -lmingwex -lmsvcr100

但是這並沒有幫助,因爲所提到的dll在dll的聲明中仍然是鏈接的。只要看一看到嵌入式圖片:

enter image description here

感謝這麼遠!

回答

1

所以我的問題是,如何觸發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