| 
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의 수출 명칭을 봐도 알 수 있는 사항입니다.
 
 혹 어쩌다 필요한 경우가 생길지도 몰라 올려 둡니다.
 |