2016-10-27 1 views
1

암시 적으로 명시 적으로 .DLL을 연결하는 데는 여러 가지 이유가 있습니다. 현재 Visual Studio 2015 및 C++을 SFML과 함께 사용하고 있습니다.DLL의 암시 적 연결과 명시 적 연결 간의 모범 사례는 무엇입니까

암시 적 : - 좋은 쪽 : .DLL 헤더 (.h)에 액세스 할 수 있으며 해당 기능에 대해 알고 있습니다. 연결하고 사용하는 것이 더 쉽습니다. 덜 오류가 발생합니다. 가장 보편적으로 사용되는 것으로 여겨집니다.

- 부모 쪽 : 링크하려면 .lib, .h 및 .dll 파일이 필요합니다. 파일이 많아 지므로 더 많은 디스크 공간을 차지하십시오.

명시 적 : - 좋은 쪽 : .dll 만 필요하기 때문에 디스크 공간을 덜 차지하십시오.

-Bad side : dll에없는 기능을 사용할 가능성이 있기 때문에 오류가 발생하기 쉽고 올바르게로드해야합니다. 헤더가 없으므로 dll에 포함 된 함수를 알 수 없습니다.

1 : 명시 적으로 연결하는 것이 나쁜 습관이라고 들었습니다. 이 올바른지?

2 : 주로 암시 적으로 연결에 초점을 맞추어야합니까?

3 : 확실히 DLL에 대한 지식이 부족합니다. DLL을 연결하는 데있어서 암시 적이고 명시적인 방법을 보지 못해서 더 좋고 나쁜면이 있습니까?

4 : 게임을 할 계획이므로 스프라이트 시트를 dll에 놓으면 포인터로 텍스처를 한 번로드하는 것이 좋습니다.

+0

실제로이 문제를 실제로 시도하려면이 방법이 상당히 잘못되었습니다. 디스크 공간에 차이는 없지만 두 경우 모두 DLL 만 배포하면됩니다.익스플로잇 (Explicit)은 dev 머신에 * 더 많은 공간을 필요로하므로, 함수 포인터 유형을 선언 할 필요가 없으며 내보내기를 파기하는 코드를 무시할 수 없다. 특히 SFML과 같은 대형 라이브러리의 경우 유지하기가 매우 힘든 코드입니다. DLL에 내보내기가 없을 수도 있기 때문에 *를 명시 적으로 사용해야합니다. DLL을 복사하기 때문에 SFML에서는 필요하지 않습니다. –

답변

0

"디스크 공간 절약"지점을 제거 할 수 있습니다. * .lib는 개발자의 컴퓨터에서만 필요합니다. 설치 프로그램에서는 두 경우 모두 DLL 만 필요합니다.

  1. 사용 사례에 따라 다릅니다. 명시 적 연결 (일반적으로 동적로드라고 함)이 유일한 방법입니다 (예 : DLL에서 사용자 제공 플러그인을 구현하는 경우). 게임, 또는 아이들 경험이없는 사용자의 많은 청중 대상으로 다른 데스크톱 앱

  2. , 나는 전혀 DLL을 사용하지 않는 것이 좋습니다. 모든 코드를 정적으로 링크하십시오. 뿐만 아니라 그것은 당신의 앱을 더 작게 만들뿐만 아니라 (링커는 당신이 호출하지 않는 라이브러리의 코드를 버릴 것이다), 이것은 또한 버그 클래스를 제거 할 것이다. 이것은 확실히 C 런타임 라이브러리 (msvcrt.dll)에도 적용됩니다.

_4. 나는 그렇게하지 않을 것이다. 논리적으로 스프라이트 시트는 코드가 아닌 데이터입니다. DLL을로드하는 방법에 관계없이 정적 또는 동적으로 DLL에 배치하면 안됩니다. 대신 파일에서 해당 데이터를로드하십시오. 게임이나 레벨을로드하는 동안 데이터 만 필요하면 ReadFile API를 사용하십시오. 게임이 실행되는 동안 스프라이트 시트를 계속 읽으면 전체 데이터 파일을 프로세스의 주소 공간에 매핑 할 수 있습니다. CreateFileMapping 및 MapViewOfFile API (내부적으로 DLL 로딩에서는이 메서드 사용)를 참조하십시오. 32 비트 응용 프로그램에 대한주의는 주소 공간이 부족합니다.

관련 문제