2012-03-19 6 views
0

CreateProcess을 사용하여 다른 C++ 프로그램 (TestProg.cxx)을 컴파일하고 DLL에 컴파일하고 연결하려면 cllink을 호출합니다.런타임에 C++ 프로그램을 컴파일하고 DLL에 연결하는 방법

TestProg.cxx는 다음 DllMain 기능이 포함되어

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 
{ 
    return TRUE; 
} 

을 내가 링크 옵션에 /Entry:DllMain을 추가했다.

내가 얻을 다음 링크 오류 :

LINK : error LNK2001: unresolved external symbol _DllMain 

main.obj : error LNK2001: unresolved external symbol __RTC_Shutdown 

main.obj : error LNK2001: unresolved external symbol __RTC_InitBase 

main.dll : fatal error LNK1120: 3 unresolved externals 

당신이 내가 그것을 해결하는 방법을 알려 주시기 바랍니다 수

? 감사합니다.

+0

제 생각 엔 C++의 이름 - mangling에 문제가있는 것 같습니다. –

+2

가능성 없음; 'extern "C"'는 C++ 이름 변경이 아니라 C를 원한다는 것을 나타내는 올바른 방법입니다. 하지만 C조차도 이름이 엉망 이네요. '_'에서 볼 수 있듯이 – MSalters

+0

멋진 정보입니다. –

답변

1

CRT (C 런타임 라이브러리)가 누락되었습니다. 예를 들어, __RTC_Shutdown 기능을 제공합니다. 링크를 연결하면 DllMain 앞에 배치됩니다. 이것은 또한 첫 번째 링크 오류를 해결합니다.

+0

귀하의 의견을 보내 주셔서 감사합니다. 나는 링크 옵션에서'/ DLL' 옵션을 사용하거나 사용하지 않고 copmilation 옵션에'/ LD'를 사용하여 코드를 테스트했습니다. 동일한 링키지 오류가 발생했습니다. 둘 다 없으면'LINK : 치명적인 오류 LNK1221 : 서브 시스템을 추론 할 수없고 정의해야합니다. '오류가 발생합니다. '/ SUBSYSTEM' 링크 옵션을 사용하면 '운영체제에서 .exe 파일을 실행하는 방법을 알려주지 만'링크를 추가 할 때 같은 링크 오류가 다시 나타납니다. CRT를 추가하는 방법을 알려주십시오 (CRT 옵션을 찾지 못했습니다). 감사! – ZOK

+0

@ZOK : 일반적인 해결책은'/ MT'를 _compiler_에 전달하는 것입니다. CRT에는 여러 버전이 있으며 링커 선택 사항은 컴파일러와 일치해야합니다. 따라서 링커는 .obj 파일에서 컴파일러의 내용을 읽습니다. 그러나 이미 이전에 말씀 드렸듯이 어쨌든 라이너를 호출해서 CL.exe로 두지 마십시오. – MSalters

+0

의견을 보내 주셔서 감사합니다. 나는 링커를 호출하지 않는다. 나는 그것을 cl에 맡긴다. '/ MT'를 컴파일러에 전달하면,'LINK : 치명적인 오류 LNK1221 : 서브 시스템을 추론 할 수없고 정의해야합니다. '오류가 발생합니다. 링커에게/SUBSYSTEM : WINDOWS를 넘겨 주면 3 개의 링키지 에러가 다시 발생합니다. 이 문제를 해결하는 방법을 알려주십시오. 감사! – ZOK