MSVC ++가 정적 라이브러리의 CRT 종속성을 무시하도록 강요하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/687179

문제

이 작업을 수행 할 수 있는지 모르겠지만 /NodeFaultLib가 정적 라이브러리 프로젝트에 적용되기를 원합니다.

공통 정적 라이브러리 D.Lib를 사용하는 많은 응용 프로그램 프로젝트 (A.Exe, B.Dll, C.DLL)가 있습니다. 이 라이브러리에는 많은 코드가 있으며 다른 .lib 종속성도 있습니다. 그중 하나는 OpenSSL 라이브러리로 CRT의 릴리스 버전에 대해 Win32 용으로 제작 된 것으로 보입니다 (원래 프로젝트/소스가 없습니다).

지금까지 CRT의 릴리스 /디버그 버전의 혼합을 피하기 위해 /nodefaultlib:msvcrt.lib 링커 지침을 모든 잎 프로젝트 (A.exe, B.dll)에 넣어야합니다. 이것은 작동하지만 그 문제를 다루는 이상적인 방법은 아니라고 생각합니다. 이 속성을 D.Lib 프로젝트에 넣으려고했지만 효과가 없습니다.

MSVC ++가 제 3 자 도서관에서 MSVCRT.LIB 의존성을 무시하도록 강요하는 방법이 있습니까?

도움이 되었습니까?

해결책

a .lib는 연결하지 않기 때문에 링커 설정이 없습니다. 에게 그것. .lib는 압축되지 않은 .zip 파일과 같은 .OBJ 파일의 아카이브 일뿐입니다. 그래서 링크 된 모든 프로젝트에 설정을 배치해야합니다.

VS2005+를 사용하는 경우 속성 시트를 사용하여 설정을 한 곳에 놓고 모든 프로젝트에서 해당 속성 시트를 사용해야합니다.

그러나 OpenSSL은 오픈 소스이므로 사용중인 버전의 소스를 가져 와서 다시 빌드 할 수 있어야합니다 (물론 버전 제어 시스템에 추가). DLL이 코드 연결을 방해하지 않기 때문에 OpenSSL이 DLL 또는 LIB로 구축 될 수 있다고 생각했습니다.

실패하면, 당신은 항상 당신의 기능을 별도의 DLL로 슬리트 할 수있는 옵션이있어서 하나의 프로젝트에만 문제가 있습니다.

다른 팁

내 이해는 라이브러리 lib가 정적으로 DLL에 연결된 경우 DLL에는 이미 LIB의 모든 관련 코드가 포함되어 있다는 것입니다. 따라서이 커플 링을 제거 할 수 없습니다. 이것은 실험이 아니라 정적 연결에 대한 나의 이해에 기초합니다.

특정 MSVC 런타임 라이브러리에 따라 분산 된 정적 링크 라이브러리를 방지하려면이 컴파일러 옵션을 설정해야합니다 (Visual Studio 2010에서는 다음과 같습니다).

구성 속성 -> c/c ++ -> advanced-> 기본 라이브러리 생략 = 예 (/zi)

이제 사용자는 디버그 빌드에서 릴리스 된 정적 LIB에 링크 할 수 있으며 링커 경고뿐만 아니라 문제를 일으키는 잘못된 런타임 라이브러리에 링크하려고 시도하지 않습니다.

라이브러리가 실제로 특정 런타임 라이브러리 또는 동작에 의존하는 경우 링크 오류가 발생할 수 있으며 호환 구성 요소는 다른 방식으로 제공되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top