.def 파일

Serepha0921·2025년 6월 20일
post-thumbnail

Dll .Def file

Debug 상태에서 모든 기능을 완성하고 테스트까지 다 마추었는데 release상태에서 빌드 하니까 함수들을 앱에서 불러오지 못합니다. 왜 이러는지는 모르겠습니다. Dumpbin을 사용해서 확인해도 release 빌드는 함수가 안 나오고 Debug빌드에서는 잘 나옵니다. 그렇다고 Debug버전의 dll을 release버전 앱에 넣을 수 는 없기에 방법을 찾은 결과 .def 파일을 알게 되었다. 원래 되야하는데 함수가 안 나오니까 .def파일로 함수를 부를 수 있게 했다.

.def 파일이란?

.def 파일 (Modulce Definition File)은 c/c++로 DLL파일(동적 라이브러리)을 만들었을때 내보낼 함수, 변수, 심벌을 명시적으로 지정해주는 텍스트 파일이다. 기본적으로 c/c++에서 __declspec(dllexport)로 함수를 외부로 불러낼 수 있지만 .def파일을 사용하면 내보내는 이름, 순서, 변수들을 제어할 수 있습니다.

1. 기본 파일 구조

LIBRARY "DllFileName"
EXPORTS
	function1
    function2
    function3
    funciton4
  • LIBRARY: DLL 파일의 이름
  • Exports: 이 아래에 내보낼 함수등을 나열

2. 함수 다른 이름으로 내보내기

c/c++코드

	extern "C" int insideFunction(int a){return a+2;}

export.def

LIBRARY "DllFileName"
EXPORTS
	OUTSIDEfunction=insideFunction

외부에서는 OUTSIDEfunction으로 보이지만 내부에서는 insideFunction으로 구현되어 있다.

3. 변수 내보내기

c/c++코드

	extern "C" int GlobalVariable = 0;

export.def

LIBRARY "DllFileName"
EXPORTS
	GlobalVariable DATA

전역변수 내고낼때 옆에 DATA키워드 필수다.

4.오더널(ordinal) 지정

export.def

LIBRARY "DllFileName"
EXPORTS
	function1 @1
    function2 @2
    function3 @3
    funciton4 @4
  • 함수의 내보내는 순서를 강제할 수 있다.
  • 오더널(ordinal)을 지정하면 함수 이름이 아니라 숫자로 해당 함수에 접근할 수 있다.

c/c++코드

HMODULE hDll = LoadLibraryA("dllfile.dll");
GetProcAddress(hModule, (LPCSTR)1);
  • (LPCSTR)1면 오더널 1번을 불러올수 있다.
  • 그리고 뒤에 NONAME이라는 키워드를 붙이면 오직 오더널로만 불러올수 있다. 이걸 쓰면 dll용량이 좀 줄어들고, 함수 이름이 안 나온다.

Visual Studio에서 .def파일 적용하는 방법

  1. 프로젝트에 .def파일 추가
  2. 프로젝트 우클릭 \rarr 속성(Properties) \rarr 링커(Linker) \rarr 입력(input) \rarr 모듈정의(Module Definition File) 파일에 .def파일명 입력
profile
안녕하세요. 뉴비 입니다

0개의 댓글