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

C++빌더 Q&A
C++Builder Programming Q&A
[74679] Re:[질문] include 되는 header file의 일부분을 include 에서 제외할 수 있나요?
빌더(TWx) [builder] 3795 읽음    2017-11-27 22:33
단단한돌 님이 쓰신 글 :
: Component간 Conflict가 발생해서 며칠째 개고생 중입니다.
: 파일들을 따라가 보니 하나의 헤더 파일을 제외하면 성공할 것 같은데요..
:
:
/////////////////////////////////////
: // UnitMain.h
: #include 
: #include "SBSimpleSftp.hpp"   // GuardnetThread.cpp에서 include에서 제외해하하는 파일
: ..
: 
: /////////////////////////////////////
: // GuardnetThread.cpp 
: #include "GuardnetThread.h"
: #include "UnitMain.h"               // UnitMain.h을 include함. => Conflict 발생..  
: #include 		// Routing 정보
: #pragma comment(lib, "iphlpapi.lib")

:
: GuardnetThread.cpp에서 UnitMain.h 파일을 include하는데,
: UnitMain.h파일의 "SBSimpleSftp.hpp" 파일과 GuardnetThread.cpp에서 include한
: <iphlpapi.h>파일이 Conflict가 발생합니다.
:
: 보통 Header file의 Dependency 때문에 문제가 발생하면,
: Include 순서를 바꾸거나, Build Order를 조정해서 해결하는데..
: 두 파일의 include 순서를 바꾸거나, Build Order를 바꿔도 마찬가지거나,
: 또다른 엄청난 Compile Error를 만들어 냅니다.
:
: 최종적으로 찾아낸 것이 <<iphlpapi.h>과 "SBSimpleSftp.hpp" 가 서로 충돌하는 상황입니다.
: GuardnetThread.cpp 에서 UnitMain.h를 Include할 때 "SBSimpleSftp.hpp" 파일만 include에서
: 제외하고 싶습니다. 그러면, 이 지난했던 문제가 해결될 것 같습니다.
:
: 결론적으로,
: 어떤 소스 파일(GuardnetThread.cpp)을 컴파일하면서,
: 이 파일이 Include 하는 파일(UnitMain.h)에서 특정 include file("SBSimpleSftp.hpp")만 Include를 제외시키고
: 싶습니다.
:
: 이런 것이 가능할까요?
:
: #pragma syntax을 뒤져봤는데.. 흔히 쓰는 hdrstop, comment, link 정도는 알겠는데..
: 다른 옵션들은 도통 이해가 가지 않네요.
:
: Incldue 하면서 특정 파일만 include에서 제외하는 것이 가능할까요?
:
: 아래는 Error Text입니다.
:
:
[bcc32 Error] mprapi.h(1273): E2015 Ambiguity between 'CERT_NAME_BLOB' and 'Sbwincrypt::CERT_NAME_BLOB'
:   Full parser context
:     GuardnetThread.cpp(16): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\iphlpapi.h
:     iphlpapi.h(34): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\iprtrmib.h
:     iprtrmib.h(38): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\mprapi.h
:     mprapi.h(1266): class _IKEV2_TUNNEL_CONFIG_PARAMS
: [bcc32 Error] mprapi.h(1309): E2015 Ambiguity between 'CRYPT_HASH_BLOB' and 'Sbwincrypt::CRYPT_HASH_BLOB'
:   Full parser context
:     GuardnetThread.cpp(16): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\iphlpapi.h
:     iphlpapi.h(34): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\iprtrmib.h
:     iprtrmib.h(38): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\mprapi.h
:     mprapi.h(1306): class _SSTP_CERT_INFO

:
: 고수님들의 도움을...~~!!
: 감사합니다.~!!
:
:
:


답변:


문제가 발생하는 원인은 파스칼 컴포넌트 소스를 컴파일해서
생성된 헤더파일이 윈도우즈 플렛폼에서 사용되는 시스템 헤더파일과
정의가 Conflict이 일어나서 발생하는 경우로 보이는데...

원천적으로 파스칼 컴포넌트 소스가 잘못 되어 있는 경우 입니다.
윈도우즈 플렛폼에서 정의되어 있는 시스템 헤더 파일들과 같이
사용되어 컴파일 될 수 있도록, 파스칼 소스에서 Wincrypt.h 시스템
헤더파일이 인클루드 돼는 내용으로 SBWinCrypt.hpp 내용이 Emit 돼도록 되어
있어야 하는데, C++ 컴파일 고려없이 파스칼 소스에서 지멋대로
CRYPTOAPI_BLOB를 정의해 놓은 건데요


Emit 되어있는 SBWinCrypt.hpp에서 CRYPTOAPI_BLOB,
CERT_NAME_BLOB 등의 정의를 지워 버리던가
파스칼 컴포넌트 소스를 수정해서 CRYPTOAPI_BLOB,
CERT_NAME_BLOB 등의 정의가 Emit 되지 않고  Wincrypt.h 시스템 헤다파일만
인클루드 하는 내용으로 SBWinCrypt.hpp 가 Emit 되도록
SBWinCrypt.hpp 를 다시 생성해서 사용하세요.


CRYPTOAPI_BLOB,  CERT_NAME_BLOB 등의 정의는 윈도우즈 시스템
헤더파일인 Wincrypt.h 에 정의되어 있습니다.




+ -

관련 글 리스트
74674 [질문] include 되는 header file의 일부분을 include 에서 제외할 수 있나요? 단단한돌 3365 2017/11/23
74679     Re:[질문] include 되는 header file의 일부분을 include 에서 제외할 수 있나요? 빌더(TWx) 3795 2017/11/27
74680         감사~감사~감사~!! 해결~!! 단단한돌 3626 2017/11/28
74675     혹시 이렇게 하는 방법은? 단단한돌 3370 2017/11/23
74681         자답... Re:혹시 이렇게 하는 방법은? 단단한돌 3557 2017/11/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.