C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[911] DLL 제작시 _ 없는 exports 명칭 만들기.
김태선 [cppbuilder] 9195 읽음    2009-08-04 20:38
CBuilder와 VC는 C의 표준 cdecl 호출 규약에 대해
obj 파일에 생성해 내는 명칭에 약간의 차이가 있는데,
CBuilder는 전통적으로 _ 언더스코어를 앞에 붙이는 형태이고
VC는 언더스코어를 붙이지 않습니다.
(그래서 외부로 드러내는 명칭은 __stdcall 호출 규약을 쓰는게 좋습니다. 그러면 prefix로 _ 가 붙지 않습니다.)

가령  a.dll 프로젝트의 a.c 파일에서

__declspec(dllexport) int  GetDouble(int x);

와 같은 함수를 외부로 드러 낸다면
CBuilder에서는 a.dll 에 _GetDouble 명칭이 드러나고
VC에서는 a.dll 에 GetDouble 명칭이 드러납니다.

그런데 빌더로 컴파일 해서 외부에 명칭을 드러낼때 앞에 _ 가 붙지 않는 형태가 필요할 때가 있습니다.

가령 LUA 소스의 DLL 프로젝트를 컴파일 한다면
당연히 외부로 드러나는 명칭은 _ 가 없는 형태이어야 기존 소스를 활용하기 좋습니다.
이럴 경우 빌더 프로젝트 옵션에서 _ 생성을 하지 않도록 옵션을 조정할 수는 있으나
이렇게 하면 빌더의 기본 C Runtime과 링크를 할수 없게 됩니다.
이는 C Runtime내의 명칭은 _ 가 붙은 형태이기 때문입니다.

이럴때는 .def 파일을 만들어 해결할 수 있습니다.
LUA 프로젝트의 경우 lua5.1.def 파일이 있는데, 이는 VC에서는 수정이 필요 없으나
빌더에서는 이를 프로젝트에 포함시키고

;VERSION 5.1.3
EXPORTS
  lua_tolstring     = _lua_tolstring
  lua_typename     = _lua_tolstring
  lua_pushfstring      = _lua_pushfstring
  lua_pushvfstring    = _lua_pushvfstring

이런 식으로 수정이 필요합니다.
첫번째 함수에 대해서만 말하면
내부에서는 _lua_tolstring 명칭을 쓰고, 외부로 드러나는 export 명칭은  lua_tolstring 를 쓰겠다는 뜻입니다.
원래 의도는 이것이지만 사실 빌더에서는 이렇게 하면
외부에는 lua_tolstring 와 _lua_tolstring 양자 모두가 드러납니다.
이는 implib 로 DLL의 수출 명칭을 봐도 알 수 있는 사항입니다.

혹 어쩌다 필요한 경우가 생길지도 몰라 올려 둡니다.

+ -

관련 글 리스트
911 DLL 제작시 _ 없는 exports 명칭 만들기. 김태선 9195 2009/08/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.