환경: C++ Builder XE5
사용 Component:
- UI Component : Button, Panel, TImage, TListView,.... 화면 UI Component들..
- Indy Compnent : IndyFTP, IndyTCPServer, IndyTCPClient
- SFTP Component : SecureBlackBox SFTP Component (상용)
기존의 프로젝트에 SFTP(SecureFTP) 기능이 필요하여 SecureBlackBox라는 Component를 추가하였습니다.
추가한 Compnent가 기존 프로텍트의 Library와 여기저기 충돌을 일으켜서 다량의 Compile Error를 만들어 냅니다.
Build Order와 Include 순서를 조정해서 Compile Error를 잡았는데, 이것 하나만은 끈질기게 해결이 되지 않고 있습니다.
에러 메세지를 보면 CERT_NAME_BLOB 라는 이름이 SecureBlackBox Component(SbwinCrypt.hpp)에서 정의되고,
Windows SDK의 Header 파일인 <iphjlpapi.h>에서도 정의되어 사용되고 있습니다.
<iphlpapi.h> 파일은 시스템의 라우팅 정보를 가져오는 함수들이 정의되어 있습니다.
이 두개의 Header 모두 프로그램 운영에는 필요한 상태입니다.
에러를 보면 GardnetThread.cpp의 컴파일 과정에서 <iphlpapi.h>을 include 하기 전에,
"UnitMain.h"를 Include하게 되는데, 그 안에서 "SBSimpleSftp.hpp"를 include 하게 되고,
"SBSimpleSftp.hpp"의 include를 따라 가서 "Sbwincrypt.hpp"까지 include하게 되는데,
"Sbwincrypt.hpp"의 내용이 <iphlpapi.h>에서 include하는 <mprapi.h>의 선언부와 충돌됩니다.
'CERT_NAME_BLOB','CRYPT_HASH_BLOB' 이 두 개의 이름이 중복된다는 결론입니다.
이 두개의 include 순서를 뒤바꾸면, 더 엄청난 Compile error가 튀어 나옵니다.
충돌을 회피할 수 있는 방법은 어떤 것이 있을까요?
2주째 이 문제로 씨름 중입니다. Help~~~~!!
[부언 설명]
GardnetThread.cpp -----------> UnitMain.h ------------->SBSimpleSftp.hpp
(iphlpapi.h include) (Sbwincrypt.hpp include)
- <iphlpapi.h> --> include --> <mprapi.h>
- <SBSimpleSftp.hpp> --> include --> <Sbwincrypt.hpp> 두 개의 파일에서 충돌..
//------------------------------------------------------------------------
// compile error 내용
[bcc32 Error] mprapi.h(1273): E2015 Ambiguity between 'CERT_NAME_BLOB' and 'Sbwincrypt::CERT_NAME_BLOB'
Full parser context
GuardnetThread.cpp(13): #include c:\program files (x86)\embarcadero\rad studio\12.0\include\windows\sdk\iphlpapi.h // 이 Header 파일이 문제를 발생
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(13): #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
//------------------------------------------------------------------------
// 파일의 내용
$Embacadero_HOME\rad studio\12.0\include\windows\sdk\mprapi.h
..
typedef struct _IKEV2_TUNNEL_CONFIG_PARAMS {
DWORD dwIdleTimeout;
DWORD dwNetworkBlackoutTime;
DWORD dwSaLifeTime;
DWORD dwSaDataSizeForRenegotiation;
DWORD dwConfigOptions;
DWORD dwTotalCertificates;
CERT_NAME_BLOB * certificateNames; // conflict 발생, 정의는 그전에 있음.
}IKEV2_TUNNEL_CONFIG_PARAMS, *PIKEV2_TUNNEL_CONFIG_PARAMS;
//------------------------------------------------------------------------
// 파일의 내용
$SecureBlackBox_HOME\Units\CBuilderXE5\SbwinCrypt.hpp
...
typedef CRYPTOAPI_BLOB CERT_NAME_BLOB; // Conflict 발생
typedef CRYPTOAPI_BLOB *PCERT_NAME_BLOB;
...
//=======================================================================
// include 관계
#include
#pragma hdrstop
#include "GuardnetThread.h"
#include "UnitMain.h" // UnitMain.h에서 SecureBlackBox SFTP Component include함.
#include "LockeCommon.h"
#include "Env.h"
#include "Thrdqueue.h"
#include // conflict 발생..
#pragma comment(lib, "iphlpapi.lib")
#pragma package(smart_init)
TGuardnetThread *thrdGuardnet;
...
//=======================================================================
// UnitMain.h 파일의 include 관계
#ifndef UnitMainH
#define UnitMainH
#include
#include
#include
#include
...// VCL Library Header
#include "SBSimpleSftp.hpp" // SecureBlackBox SFTP Component include
// Indy Component 뒤에서 Include 하면 또다른 compile error
#include
#include
#include
#include
...//Indy Library Header
#include
...// DBExpress Header
#include "AdPort.hpp"
#include "OoMisc.hpp"
...// other header include
namespace를 지정하여 해결하는 방법이 있을까요?