|
빌더짱 님이 쓰신 글 :
: 라이브러리를 추가해서 쓰려고하는데
:
: #include <Awesomium/WebCore.h>
: #include <Awesomium/WebView.h>
:
: #pragma comment (lib, "awesomium.lib")
:
: using namespace Awesomium;
:
: 인클루드 하구 여기까진 정상인데
:
:
: Awesomium::WebConfig wc;
:
: 이것만 호출하면 아래같은 에러가 나오네요 ㅠㅠ 어떻게 해결해야하는지 감이안오네요 고수님들
:
: 꼭좀 조언부탁드립니다. 해당 라이브러리와 헤더들 첨부했으니 꼭좀 봐주세요 ㅠㅠ
:
:
: [ilink32 Error] Error: Unresolved external 'Awesomium::WebStringArray::~WebStringArray()' referenced from C:\WORKSPACE\DLL3\WIN32\RELEASE\TCP.OBJ
: [ilink32 Error] Error: Unresolved external 'Awesomium::WebString::~WebString()' referenced from C:\WORKSPACE\DLL3\WIN32\RELEASE\TCP.OBJ
: [ilink32 Error] Error: Unresolved external 'Awesomium::WebConfig::WebConfig()' referenced from C:\WORKSPACE\DLL3\WIN32\RELEASE\TCP.OBJ
답변:
VC++ C++ 코드로 만들어진 awesomium.dll 파일을 엠바 툴로 임포트해서 awesomium.lib 파일을 만든거 같은데...
namespace Awesomium
{
class __declspec(dllexport) CClass
{
CClass();
void Func(int a, int b);
};
}
awesomium.dll 파일은...
위와 같은 식으로 클래스 수준에서 export하고 있는 구조로 돼 있는데...
컴파일러 마다 클래스 메소드를 데코레이션 하는 방법은 각기 다릅니다.
namespace인 Awesomium, 클레스 네임, 메소드 네임 순서로 데코레이션 할 수도 있고
클래스 네임, 네임 스페이스, 메소드 네임의 순서가 될 수도 있습니다.
constructor 네임과, operator new[], operator delete 이름도 컴파일러 마다 다르게 데코레이션 됩니다.
파라미터 인수도 마찬가지 입니다.
엠바 임포트 라이브러리 툴은 'C' 인터페이스 수준에서 기본적인 변환만 해줄 뿐...
namespace, class name, method 데코레이션 까지 변환해 주지는 못합니다.
클래스 메소드의 호출방식도 컴파일러 마다 다릅니다.
VC++ 경우, this 포인터 값을 ECX 레지스터에 넣고, 나머지 파라미터들은 _stdcall 방식으로 스택에 넣는 반면에...
BC++은 __fastcall 이 아닌, 일반적인 클래스 메소드에 대해서... this 포인터를 포함한 모든 파라미터를 스택에 푸쉬하는 호출방식을
사용 합니다 (RAD 10 Seattle 기준)
또 하나 문제가 되는 부분은...
컴파일러 마다 C++ABI를 구현하는 방식이 달라서... 바이너리 레벨에서 Exception 호환이 안된다는 겁니다.
try...catch 의 중첩 레벨, call site, landing pad 정보 등등... Exception 처리를 위해 컴파일러가 여러 정보를 생성하게 되는데
lsda 구조가 컴파일러 마다 다르지요.
이런 경우... 해당 컴파일러에서 C++ 소스코드를 갖고 다시 빌드하는 방법 밖엔 없습니다.
공개된 라이브러리 중에는... 소스코드 제공없이, 바이너리 형태로만 배포되는 경우도 많은데...
엠바 툴이 워낙 시장에서 사용자가 없다 보니 VC++용으로만 배포되는 경우가 거의 대부분이라는 게 문제죠.
|