사용할 내보내기 방법 결정
함수를 내보내는 데 사용할 방법(.def 파일 또는 __declspec(dllexport) 키워드)을 결정하려면 다음 사항을 고려합니다.
내보내기 함수를 계속 추가할지 여부
DLL 사용자 (예: 사용자가 다시 빌드할 수 없는 여러 실행 파일에서 사용되는 타사 DLL인지 또는 사용자가 쉽게 다시 빌드할 수 있는 응용 프로그램에서만 사용되는 DLL인지 여부)
.DEF 파일 사용의 장단점
.def 파일에서 함수를 내보내면 내보내기 서수를 제어할 수 있습니다. 즉, DLL에 내보내기 함수를 더 추가할 때 이 함수에 내보내는 다른 모든 함수의 서수 값보다 더 높은 서수 값을 할당할 수 있습니다. 이렇게 하면 암시적 링크를 사용하는 응용 프로그램에서 새 함수가 들어 있는 새로운 가져오기 라이브러리에 다시 링크할 필요가 없습니다. 이는 여러 응용 프로그램에서 사용할 타사 DLL을 디자인하는 경우에 특히 유용합니다. 즉, 기능을 추가하여 DLL을 계속 향상시키면서도 기존 응용 프로그램이 계속 새 DLL과 올바르게 작동하도록 할 수 있습니다. MFC DLL은 .def 파일을 사용하여 빌드됩니다.
.def 파일을 사용할 때의 또 다른 장점은 DLL의 내보내기 테이블에 서수만 포함시키는 NONAME 특성을 사용하여 함수를 내보낼 수 있다는 점입니다. 내보내기 함수가 많은 DLL의 경우, NONAME 특성을 사용하면 DLL 파일의 크기를 줄일 수 있습니다. 모듈 정의 문의 작성에 대한 자세한 내용은 모듈 정의 문의 규칙을 참조하십시오. 서수 내보내기에 대한 자세한 내용은 이름 대신 서수를 사용하여 DLL에서 함수 내보내기를 참조하십시오.
.def 파일을 사용할 경우 중요한 단점은 C++ 파일에서 함수를 내보내는 경우 컴파일러에 의한 이름 데코레이션을 방지하기 위해 .def 파일에 데코레이팅된 이름을 포함시키거나 extern "C"를 사용하여 내보내기 함수를 표준 C 링크로 정의해야 한다는 점입니다.
.def 파일에 데코레이팅된 이름을 포함해야 하는 경우 이 이름은 DUMPBIN 도구 또는 링커 옵션 /MAP을 사용하여 가져올 수 있습니다. 컴파일러에서 생성된 데코레이팅된 이름은 해당 컴파일러에서만 사용할 수 있습니다. Visual C++ 컴파일러에서 생성된 데코레이팅된 이름을 .def 파일에 포함하는 경우, 호출 응용 프로그램의 데코레이팅된 이름과 DLL의 .def 파일에 있는 내보내는 이름이 일치하도록 해당 DLL에 링크하는 응용 프로그램도 같은 버전의 Visual C++를 사용하여 빌드해야 합니다.
__declspec(dllexport) 사용의 장단점
**__declspec(dllexport)**을 사용하면 .def 파일을 관리하고 내보내기 함수의 데코레이팅된 이름을 가져오는 데 편리합니다. 예를 들어 이 방법은 제어 대상인 응용 프로그램과 함께 사용하려는 DLL을 디자인하는 데 적합합니다. 새 내보내기로 DLL을 다시 빌드하는 경우 응용 프로그램도 다시 빌드해야 합니다. 서로 다른 버전의 컴파일러를 사용하여 다시 컴파일하는 경우 내보낸 C++ 함수의 데코레이팅된 이름이 변경될 수 있기 때문입니다.