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
[860] EXE DLL 공통으로 쓰는 유닛에 대한 링크 오류 방지법.
김태선 [cppbuilder] 7294 읽음    2009-02-21 13:56
A.EXE 와 A.DLL 이라는 프로그램에서
aunit.cpp  유닛을 공통으로 사용한다고 합시다.

그런데 이 aunit.cpp 에서는 EXE 프로젝트인 경우와 DLL 프로젝트인 경우의
처리 코드가 조금 틀립니다. 거의 모든 코드가 같으나 일부분의 동작 코드가 틀리기 때문에
확실하게 EXE 프로젝트와 DLL 프로젝트를 구분해서 컴파일 되어야만 한다고 합시다.

이럴때, aunit.cpp를 EXE 프로젝트 상태에서 컴파일 했는데
그 결과물 aunit.obj 가 DLL 을 Make 할때 포함되어 버리면 당연히 문제가 됩니다.
aunit.cpp 가 DLL 용으로 컴파일 된 aunit.obj 가 DLL을 Make 할때 포함되어야 하기 때문입니다.

프로젝트 구성시 양쪽에 aunit.cpp 유닛이 포함되어 있으면, Make 시
똑똑한 빌더가 그 수정 여부를 체크해 제대로
링크해서 결과물을 만들어 내니, 일반적인 경우라면 사실 별다른 문제는 없습니다.

그러나 여러가지 복잡한 상황이라 이를 코드 차원에서 확실히 해두고자 한다면 다음과 같은
기법을 쓸수 있습니다.

aunit.cpp 내에

#ifdef __DLL__
void ___DLL_myfunc() { }
#else
void ___EXE_myfunc() { }
#endif

이렇게 넣어 두고
A.EXE 프로젝트의 메인 유닛 즈음에
void ___EXE_myfunc();
를 호출하는 코드를 넣고,

B.DLL 프로젝트의 메인 유닛 즈음에
void ___DLL_myfunc();
을 호출하는 코드를 넣으면,

만일 컴퓨터와 시계가 바뀐다던지 또는 어떤 문제 때문에 EXE 버전에 링크되어야 할 aunit.obj 가 DLL 버전에 링크되는 오류를 확실하게 막을 수 있습니다. 반대의 경우도 마찬가지이고요.
이는 DLL 프로젝트를 Make 하는데 어떤 이유로 aunit.cpp 가 DLL 모드로 재 컴파일이 안된 경우에,
컴파일러가 이를 인지하지 못했다 하더라고 링크 과정에서 ___DLL_myfunc(); 를 찾을 수 없다고
나오기 때문입니다. 그러므로 반드시 DLL 프로젝트 하에서 aunit.cpp 를 재컴파일 하지 않을 수 없는 것입니다.

대체로 일반적인 프로젝트는 신경을 안써도 되나
복잡하고 매우 신경쓰이는 프로젝트에서
EXE와 DLL 모드에서의 확실한 제대로된 컴파일 결과물을 얻고 싶을때 쓸 수 있는 방법입니다.

그럼..

+ -

관련 글 리스트
860 EXE DLL 공통으로 쓰는 유닛에 대한 링크 오류 방지법. 김태선 7294 2009/02/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.