2009-12-14 5 views
3

나는 소스가있는 dll과 exe를 가지고있다.exe ​​안에 정적 라이브러리 컴파일

DLL의 경우 완전히 정적으로 컴파일되어 있으므로 .lib도 정적이라고 가정합니다. 그러나, 그 내 lib 내 C++ VC++ 2008 프로젝트에서 링커> 입력> 추가 종속성 포함 할 때. 나는 컴파일 모드를/MT (멀티 스레드)로 설정했다.

모든 것이 컴파일되지만 exe를 실행하려고하면 DLL이 필요합니다! 나의 (제한된) 이해의 최상단에, 그것은 일어나서는 안된다.

왜해야합니까?

답변

7

참조하는 '컴파일 모드'설정은 생성하는 라이브러리 나 실행 파일에 링크 된 런타임 라이브러리의 설정입니다.

프로젝트가 DLL을 생성하도록 설정된 경우 (기본 프로젝트 페이지 확인) 런타임 라이브러리 설정에 상관없이 DLL이 생성됩니다. 무엇입니까? 은 런타임 라이브러리 설정을 변경하는 대신 DLL의 기본 프로젝트 페이지의 설정을 DLL에서 정적 라이브러리로 변경한다고 생각합니다.

일단이 작업을 완료하면 실행 파일과 라이브러리 프로젝트가 동일한 런타임 라이브러리 설정 (참조하는/MT 스위치)을 가지고 있는지 확인하십시오. 그렇지 않으면 링커가 동일한 경우 많은 수의 이상한 오류 메시지가 표시됩니다 동일한 실행 파일에서 두 개의 서로 다른 런타임 라이브러리를 일치 시키려고합니다.

+0

흠 ... 그 말이 맞는 것 같습니다 ... 나는 지금 그것을 시도하고 있습니다. –

+0

DLL에서 정적 라이브러리로 makefile을 변경하는 데 문제가 있습니다. –

+0

저는 정적 라이브러리가 있습니다. 추가 종속성으로 넣어 그것을 시작할 때 여전히 DLL을 묻습니다. –

3

"정적"DLL로 만든 .lib 파일은 라이브러리의 모든 기호에 대한 자동 동적 연결을 처리하는 가져 오기 라이브러리 일뿐입니다. DLL 자체 (.dll 파일)에는 여전히 모든 코드/기호/등이 들어 있습니다. 당신이 기대하는 것.

.lib 파일에 정적으로 연결하면 LoadLibrary()/GetProcAddress() 등을 수동으로 호출하지 않아도 DLL 내의 심볼을 확인할 수 있습니다.

실제 정적 라이브러리 (즉, 가져 오기가 아닌 모든 기호 & 코드)를 만들지 않으면 DLL 자체가 필요합니다.

+0

아. 설명 해줘서 고마워. 이제는 DLL 대신 정적 라이브러리로 프로젝트를 재구성해야합니다. –

+0

정적 라이브러리를 종속성으로두고 여전히 DLL을 묻습니다. –

+0

@ Ramblingwood : 정적 코드 라이브러리가 아닌 DLL + 정적 가져 오기 라이브러리를 구축하고있는 것처럼 들립니다. 그렇게 할 때까지는 DLL을 제거 할 수 없습니다. –