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
[74680] 감사~감사~감사~!! 해결~!!
단단한돌 [heaven2] 3651 읽음    2017-11-28 12:03
해결했습니다.
빌더님의 지적이 맞는 것 같습니다.
conflict나는 소스가 xxxx.hpp(델파이를 제너레이트한)에서 발생하구요..

제가 한 것은, xxx.hpp 파일을 강제적으로 수정한 것은 아니고,
conflict나는 소스 파일의 include 될 때,
결국 conflict가 안나게 조정하는 것인데.. 좀 복잡하게 되는 양상이랄까요?
GuardnetThread.cpp에서 include하는 UnitMain.h와 다른 header 파일간의 부딛치는 양상이였는데..
결국, 부딫치는 Header의 내용을 GuardnetThread.cpp  파일에 중복해서 써버림으로써,
즉, xxxx.hpp를 include하기 전에 Conflict나느 header 파일을 먼저 중복해서 써버림으로 문제를 해결하고,
Builder order나 include 순서로 도저히 해결되지 않는 소스는.
Conlfict나는 소스의 리부분을 별도의 xxx.cpp/h 파일로 분리해서 xxx.cpp 파일에서만 include하도록
했습니다.

결국 2주만에 머리를 갈아 넣어서 해결은 했는데.. 흰머리는 수십개쯤 는 것 같네요.
감사합니다.

Header file 간의 Conflict 해결 방법은
정리하면..
1. Build Order 정리
2. Header file include 순서 바꾸어서 해결
   - include한 파일 안에서 include한 파일이 conflict날 때 등의 문제 해결 => 졸라 골 빠개짐.
     => 이런 경우 conflict나는 파일을 먼저 써버리고 해결..
#include "SBSimpleSftp.hpp"   	// 반드시 여기에 쓸 것 (include UnitMain.h 하기 전에 쓸 것)
#include "UnitMain.h"
#include "FtpThread.h"

=> 여기서 SBSimpleSftp.hpp와 UnitMain.h에서 include하는 vcl.xxx.h 파일과 충돌발생
그래서 이렇게 해겨함. 

#include 
#include 
#include // vcl compoent를 중복으로 include 하는 것은 Sftp을 include하고
                                                           // unitmain.h를 Include할 때 VCL component와 다시 충돌하기 때문에 이렇게 함
#include "SBSimpleSftp.hpp"   	// 반드시 여기에 쓸 것 (include UnitMain.h 하기 전에 쓸 것)

#include "UnitMain.h"
#include "FtpThread.h"

=> 결국 include order로 해결한 것인데 그냥 강제적으로 해당 해더를 먼저 include하는 것으로 해결


3. 위의 두 개의 과정으로 해결되지 않을 때, 결국 소스의 일부분을 다른 xxx.cpp/h 파일로 옮겨서
   해결

저의 경우 PC의 Routing 정보를 가져오는 헤더 파일이 소스 여기저기에서 Conflict 났는데..

#include 		// Routing 정보
#pragma comment(lib, "iphlpapi.lib")


이 안에 정의된 함수를 사용하는 Function을 별도의 xxx.cpp/h로 옮기고,
xxx.h 파일만 include하는 것으로 해결했습니다. Header에는 함수의 원형 부분만 있으니
실질적인 include 문은 xxxx.cpp에서 사용하니 Conflict를 해결할 수 있었습니다.

머리를 갈아 넣으니 되긴 되는데..
너무 힘들게 됐네요.

다른 분들은 저와 같은 시행착오가 없기를..


빌더(TWx) 님이 쓰신 글 :
: 단단한돌 님이 쓰신 글 :
: : 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 에서 제외할 수 있나요? 단단한돌 3401 2017/11/23
74679     Re:[질문] include 되는 header file의 일부분을 include 에서 제외할 수 있나요? 빌더(TWx) 3826 2017/11/27
74680         감사~감사~감사~!! 해결~!! 단단한돌 3651 2017/11/28
74675     혹시 이렇게 하는 방법은? 단단한돌 3396 2017/11/23
74681         자답... Re:혹시 이렇게 하는 방법은? 단단한돌 3585 2017/11/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.