2013-06-19 7 views
0

플랫폼 : Windows XP; MingGW with (gcc v.4.7.2)MinGW를 트리거하여 "libstdC++. dll"및 "libgcc_s_dw2-1.dll"내의 "msvcr.dll"대신 "msvcr100.dll"을 연결하는 방법?

이 글에서 언급했듯이 어떻게해야합니까?

왜? MinGW로 응용 프로그램을 컴파일 할 경우 Windowx XP에서 멀티 스레드 응용 프로그램의 충돌을 확인합니다. 백 트레이스에 따르면 "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 

그래서 내 질문은 "된 libstdC++ DLL."와 "libgcc_s_dw2-1.dll"에서 "msvcr100.dll"에 대한 링크는 MinGW를 실행하는 방법에 대해 설명합니다.

* 관하여 libgcc : % {mthreads : -lmingwthrd}

나는 이미 내 사양 파일을 적용했습니다 -lmingw32 % {공유 관하여 libgcc : -lgcc_s} % {공유 관하여 libgcc :! - lgcc_eh} -lgcc -lmoldname -lmingwex -lmsvcr100

언급 된 dll이 dll의 명시된 내에서 여전히 링크되어 있기 때문에 그러나 도움이되지 않습니다. 그냥 삽입 된 그림을 살펴 :

enter image description here

감사합니다 지금까지!

브롬

답변

1

그래서 제 질문은, "libgcc_s_dw2-1.dll"는 "된 libstdC++. dll을"및

에서 "msvcr100.dll" 에 대한 링크는 MinGW를 실행하는 방법 이러한 라이브러리는 MinGW에서 제공하고 빌드하며, 응용 프로그램 빌드의 일부로 빌드되지 않습니다. 따라서 먼저 msvcr100.dll에 연결할 수 있도록 소스에서 직접이 두 개의 라이브러리를 만들어야합니다.

그러나 실제로 수행해야하는 작업은 응용 프로그램을이 두 라이브러리에 정적으로 연결하고 DLL 종속성을 제거하는 것입니다. 예를 들어, configure.ac에서 다음과 같이 사용할 수 있습니다

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

난 여전히 특정 충돌이 발생되는 것을 의심한다. 많은 dll은 msvcrt에 의존합니다. 예를 들어 WS2_32.dll을 확장하면됩니다.

그런데 맞춤 사양은 -lmoldname100

을 사용해야합니다.