문제

Windows/MSVC에서 사용할 C++ 라이브러리를 만들려고 합니다.

내 문제는 제대로 연결하려면 여러 버전의 MSVC C++ 런타임(단일 및 다중 스레드, 디버그 및 릴리스, 다른 컴파일러 버전, 다양한 기타 보안 및 기타 버전)에 대해 연결된 여러 버전을 배포해야 한다는 것입니다. 다른 옵션.

저는 32비트와 64비트 두 개만 배포하고 싶습니다.

내 생각은 모든 STL 유형에 대해 다른 new 연산자(예: mynew)와 사용자 정의 할당자를 사용하는 것입니다.lib를 생성할 때 /nodefaultlib.그런 다음 상위 프로젝트에서 연결할 때 mynew를 new로 연결하고 내 stl 할당자를 표준 프로젝트(또는 선택한 것 중 하나)에 연결하도록 요구합니다.삭제와 몇 가지 다른 기능을 수행해야 할 것 같습니다.당연히 라이브러리를 사용하여 썽킹 구현의 예를 제공하겠지만 이는 모든 사람의 골치 아픈 일을 줄여주기를 바랍니다.

이것이 가능한가?누구든지 이것을 시도한 적이 있습니까?Windows/MSVC에서 라이브러리 생성/배포에 대한 모범 사례가 있습니까?

도움이 되었습니까?

해결책

일반적인 답변으로 정적 연결을 원합니다.

Chris의 답변에 대한 간단한 참고 사항(대체로 좋기 때문에 부스트를 해제하고 싶지는 않지만...):

msvcrt.dll(버전이 없는 것)에 링크하지 마십시오.이는 OS별 버전 DLL이므로 링크하면 앱이 다른 버전의 Windows에서 작동하지 않을 수 있습니다.내가 아는 한, 항상 msvcrt##.dll에 연결해야 합니다.DDK에는 이에 대한 lib가 포함될 수 있지만 실제로 수행 중인 작업을 알지 않는 한 링크하지 마십시오.

다른 팁

C++ 런타임 라이브러리에 정적으로 링크:

  1. 프로젝트 속성을 엽니다.
  2. 구성 속성으로 이동 | C/C ++ | 코드 생성 섹션.
  3. 런타임 라이브러리를 다중 스레드(/MT)로 설정합니다.

C++를 사용하는 경우 사용자 지정 할당자를 사용할 필요가 없으며 모든 할당을 래핑합니다. std::tr1::shared_ptr (할당 해제 기능을 지정할 수 있음)이렇게 하면 클라이언트가 공유 포인터에 대한 마지막 참조를 해제하더라도 개체가 해제될 때 호출되는 것은 여전히 ​​라이브러리(또는 라이브러리의 CRT)에 있는 코드입니다.

이것이 "DLL 경계 지옥"을 해결하는 한 가지 방법입니다.도움이 되길 바랍니다!:-)

편집하다:귀하의 질문의 의도를 잘못 읽은 것 같습니다.DLL 경계 지옥에 대해 걱정하기 때문에 CRT에 대한 종속성을 원하지 않는 대신 어디에서나 설치할 수 있는 DLL 버전을 원했다고 가정합니다.이 경우 프로그램 링크를 다음으로 만들 수 있습니다. msvcrt.dll.모든 Windows 시스템에서 사용할 수 있습니다.

당신은 나에게서 이 말을 듣지 못했지만 드라이버 개발 키트에서 최신 버전의 Visual Studio에 연결할 수 있는 일종의 가져오기 라이브러리를 찾을 수 있습니다. msvcrt.

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