문제

MFC로 처음 시작했을 때 90 년대에 앱을 동적으로 연결하고 관련 MFC DLL을 배송했습니다. 이로 인해 몇 가지 문제가 발생했으며 (DLL Hell!) MFC뿐만 아니라 CRT 및 ATL을 위해 정적으로 연결되었습니다. 더 큰 EXE 파일 외에도 정적으로 연결되는 것은 전혀 문제를 일으키지 않았습니다. 다른 사람들이 만난 단점이 있습니까? 동적 링크를 다시 다시 방문해야할만한 이유가 있습니까? 내 앱은 주로 STL/BOST 일 요즘 FWIW입니다.

도움이 되었습니까?

해결책

몇 가지 단점이 있습니다.

  • 더 큰 exe 크기 (여러 exe를 배송하는 경우 esp)
  • 동적 링크에 의존하거나 가정하는 다른 DLL을 사용하는 문제 (예 : 정적 라이브러리로 얻을 수없는 제 3 자 DLL)
  • 독립적 인 정적 연결을 가진 DLL 간의 다른 C- 런타임 (교차 모듈 할당/거래 로스)
  • 공유 구성 요소의 자동 서비스 없음 (제 3 자 모듈 공급 업체가 응용 프로그램을 다시 컴파일하고 업데이트하지 않고 문제를 해결하기 위해 코드를 업데이트 할 수있는 기능 없음)

우리는 Windows 앱에 대한 정적 링크를 수행합니다. 주로 Xcopy 배포를 허용하기 때문에 프로세스와 메커니즘이 잘 문서화되지 않았거나 쉽게 원격으로 할 수 없기 때문에 SXS DLL을 설치하거나 의존하는 데 불가능합니다. 설치 디렉토리에 로컬 DLL을 사용하는 경우 약간 작동하지만 잘 지원되지는 않습니다. 원격 시스템에서 MSI를 통과하지 않고 원격 설치를 쉽게 수행 할 수 없다는 것은 동적 링크를 사용하지 않지만 (지적했듯이) 정적 링크에 다른 많은 이점이 있습니다. 각자에는 장단점이 있습니다. 바라건대 이것은 그들을 열거하는 데 도움이됩니다.

다른 팁

내가 이것에 대해 듣는 대부분의 답변은 DLL을 다른 프로그램과 공유하거나 소프트웨어를 패치 할 필요없이 해당 DLL을 업데이트하는 것과 관련이 있습니다.

솔직히 나는 이것들이 위도가 아니라 단점이라고 생각합니다. 제 3 자 DLL이 업데이트되면 소프트웨어를 중단하기에 충분히 변경 될 수 있습니다. 그리고 요즘 하드 드라이브 공간은 한때만큼 귀중하지 않으며, 실행 파일의 추가 500k가 있습니까? 무슨 상관이야?

  • 소프트웨어가 사용하는 DLL 버전을 100% 확신하는 것이 좋습니다.
  • 고객이 의존성 두통이 없을 것이라고 확신하는 것은 좋은 일입니다.

상향은 내 의견으로는 단점보다 훨씬 큽니다

사용량을 특정 라이브러리로 제한하고 DLL을 사용하지 않는 한 좋을 것입니다.

불행히도 정적으로 연결할 수없는 라이브러리가 있습니다. 내가 가진 가장 좋은 예는 OpenMP입니다. Visual Studio의 OpenMP 지원을 활용하면 런타임이 설치되어 있는지 확인해야합니다 (이 경우 vcomp.dll).

DLL을 사용한다면 심각한 체조 없이는 일부 아이템을 앞뒤로 전달할 수 없습니다. STD :: 문자열이 떠 오릅니다. EXE와 DLL이 동적으로 연결되어 있으면 CRT에서 할당이 발생합니다. 그렇지 않으면 프로그램이 한쪽에 문자열을 할당하고 다른쪽에 거래하려고 시도 할 수 있습니다. 나쁜 것들이 ...

즉, 나는 여전히 내 Exe와 DLL을 정적으로 연결합니다. 그것은 설치의 많은 척추를 줄이고 몇 가지 한계가있을 가치가 있다고 생각합니다.

DLL을 사용하는 것 중 하나는 여러 프로세스가 동일한 DLL을로드하면 코드를 공유 할 수 있다는 것입니다. 이렇게하면 다른 프로그램에서 이미 사용한 DLL을로드하는 응용 프로그램의 메모리를 절약하고로드 시간을 단축 할 수 있습니다.

아니요, 그 전선에 새로운 것은 없습니다. 그렇게 유지하십시오.

가장 확실히.

할당은 '정적'힙에서 수행됩니다. 할당 할당을 동일한 힙에 수행해야하므로 라이브러리를 배송하는 경우 클라이언트 코드가 '귀하의'라고 부를 수 없도록 관리해야합니다. p = new LibClass() 그리고 해당 객체 자체를 사용하여 삭제하십시오 delete p;.

내 결론 : 클라이언트 코드의 방패 할당 및 거래 또는 CRT를 동적으로 연결합니다.

LGPL과 같은 일부 소프트웨어 라이센스가있어서 DLL을 사용하거나 응용 프로그램을 링크 할 수있는 객체 파일로 애플리케이션을 배포해야합니다. 그러한 라이브러리를 사용하는 경우 DLL으로 사용하고 싶을 것입니다.

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