digitalmars.D - Help binding over to C++
- Chris Williams (167/167) Apr 02 2009 I'm trying to connect over to the C++ package called Awesomium (http://p...
- Jason House (2/208) Apr 03 2009
I'm trying to connect over to the C++ package called Awesomium (http://princeofcode.com/awesomium.php), which is decently small. I've created the files dawesome.h, dawesome.cpp, and dawesome.di, which you can see at the bottom of this post. Awesomium's library file was an import library, so I used coffimplib to convert it. I am using dmc to compile my files, using Digital Mars' stlport package. But so when, at the end, I try to compile a full EXE on a test program (dawesome_test.d), I get some linker errors combining it with my bindings (dawesome.obj) and awesomium's converted library: T:\programs\Dawesome>t:\dmd\windows\bin\dmd.exe dawesome_test.d dawesome.obj awesomium.lib OPTLINK (R) for Win32 Release 8.00.1 Copyright (C) Digital Mars 1989-2004 All rights reserved. dawesome.obj(dawesome) Error 42: Symbol Undefined ?loadURL WebView Awesomium QAEXABV?$basic_string st d DV?$char_traits std D 1 V?$allocator std D 1 std (void syscall Awesomium::We bView::loadURL(basic_string<>::d::DV?$char_traits::std::D::WebView const &,alloc ator<>::d::D::WebView )) dawesome.obj(dawesome) Error 42: Symbol Undefined ?setCustomResponsePage WebCore Awesomium QAEXHABV?$ basic_string std DV?$char_traits std D 1 V?$allocator std D 1 std (void syscal l Awesomium::WebCore::setCustomResponsePage(int ,basic_string<>::d::DV?$char_tra its::std::D::WebCore const &,allocator<>::d::D::WebCore )) dawesome.obj(dawesome) Error 42: Symbol Undefined ?setBaseDirectory WebCore Awesomium QAEXABV?$basic_ string std DV?$char_traits std D 1 V?$allocator std D 1 std (void syscall Awes omium::WebCore::setBaseDirectory(basic_string<>::d::DV?$char_traits::std::D::Web Core const &,allocator<>::d::D::WebCore )) --- errorlevel 3 I'm very new to D and was always more a C guy than a C++ guy, so I'm really not sure where in the chain I might have gone wrong. Here are my files: dawesome.h ----------------------------------------------- #ifndef __DAWESOME_H__ #define __DAWESOME_H__ extern "C" { struct listen_funcs { void (*onBeginNavigation)(const char* url); void (*onBeginLoading)(const char* url, int statusCode, const wchar_t* mimeType); void (*onFinishLoading)(); void (*onReceiveTitle)(const wchar_t* title); void (*onChangeTooltip)(const wchar_t* tooltip); void (*onChangeKeyboardFocus)(int isFocused); }; int dawesome_init(struct listen_funcs* l_funcs, const char* baseDir, int width, int height); void dawesome_cleanup(); void dawesome_setCustomResponsePage(int statusCode, const char* filePath); void dawesome_loadURL(const char* url); void dawesome_loadHTML(const char* html); void dawesome_loadFile(const char* path); void dawesome_render(unsigned char* destination, int destRowSpan, int destDepth); void dawesome_resize(int width, int height); } #endif ----------------------------------------------- dawesome.cpp ----------------------------------------------- #include "dawesome.h" #include "WebCore.h" #include <string> using namespace Awesomium; class MyListener : public WebViewListener { private: struct listen_funcs* my_listener; public: MyListener(struct listen_funcs* listener) { my_listener = listener; } void onBeginNavigation(const std::string& url) { if (my_listener->onBeginNavigation != NULL) { my_listener->onBeginNavigation(url.c_str()); } } void onBeginLoading(const std::string& url, int statusCode, const std::wstring& mimeType) { if (my_listener->onBeginLoading != NULL) { my_listener->onBeginLoading( url.c_str(), statusCode, mimeType.c_str() ); } } void onFinishLoading() { if (my_listener->onFinishLoading != NULL) { my_listener->onFinishLoading(); } } void onCallback(const std::string& name, const Awesomium::JSArguments& args) {} void onReceiveTitle(const std::wstring& title) { if (my_listener->onReceiveTitle != NULL) { my_listener->onReceiveTitle(title.c_str()); } } void onChangeTooltip(const std::wstring& tooltip) { if (my_listener->onChangeTooltip != NULL) { my_listener->onChangeTooltip(tooltip.c_str()); } } void onChangeCursor(const HCURSOR& cursor) {} void onChangeKeyboardFocus(bool isFocused) { if (my_listener->onChangeKeyboardFocus != NULL) { my_listener->onChangeKeyboardFocus( isFocused ? 1 : 0 ); } } }; //------------- WebCore* core; WebView* view; MyListener* listener; int dawesome_init(struct listen_funcs* l_funcs, const char* baseDir, int width, int height) { std::string str(baseDir); core = new WebCore(LOG_VERBOSE); core->setBaseDirectory(str); view = core->createWebView(width, height, false, true, 70); if (view == NULL) return 0; listener = new MyListener(l_funcs); view->setListener(listener); return 1; } void dawesome_cleanup() { view->destroy(); delete core; delete listener; } void dawesome_setCustomResponsePage(int statusCode, const char* filePath) { std::string str(filePath); core->setCustomResponsePage(statusCode, str); } void dawesome_loadURL(const char* url) { std::string str(url); view->loadURL(str, "", ""); } void dawesome_loadHTML(const char* html) { std::string str(html); view->loadURL(str); } void dawesome_loadFile(const char* path) { std::string str(path); view->loadURL(str); } void dawesome_render(unsigned char* destination, int destRowSpan, int destDepth) { view->render(destination, destRowSpan, destDepth, 0); } void dawesome_resize(int width, int height) { view->resize(width, height); } ----------------------------------------------- dawesome.di ----------------------------------------------- extern (C) { struct listen_funcs { void (*onBeginNavigation)(char* url); void (*onBeginLoading)(char* url, int statusCode, wchar* mimeType); void (*onFinishLoading)(); void (*onReceiveTitle)(wchar* title); void (*onChangeTooltip)(wchar* tooltip); void (*onChangeKeyboardFocus)(int isFocused); } int dawesome_init(listen_funcs* l_funcs, char* baseDir, int width, int height); void dawesome_cleanup(); void dawesome_setCustomResponsePage(int statusCode, char* filePath); void dawesome_loadURL(char* url); void dawesome_loadHTML(char* html); void dawesome_loadFile(char* path); void dawesome_render(ubyte* destination, int destRowSpan, int destDepth); void dawesome_resize(int width, int height); } -----------------------------------------------
Apr 02 2009
Your linker errors have nothing to do with your d/C++ bindings. It looks like your dll is missing critical stuff referenced by your C++ code. Find where WebCore and WebView are implemented and ensure they're part of the dll (or add extra object files on the command line) Chris Williams Wrote:I'm trying to connect over to the C++ package called Awesomium (http://princeofcode.com/awesomium.php), which is decently small. I've created the files dawesome.h, dawesome.cpp, and dawesome.di, which you can see at the bottom of this post. Awesomium's library file was an import library, so I used coffimplib to convert it. I am using dmc to compile my files, using Digital Mars' stlport package. But so when, at the end, I try to compile a full EXE on a test program (dawesome_test.d), I get some linker errors combining it with my bindings (dawesome.obj) and awesomium's converted library: T:\programs\Dawesome>t:\dmd\windows\bin\dmd.exe dawesome_test.d dawesome.obj awesomium.lib OPTLINK (R) for Win32 Release 8.00.1 Copyright (C) Digital Mars 1989-2004 All rights reserved. dawesome.obj(dawesome) Error 42: Symbol Undefined ?loadURL WebView Awesomium QAEXABV?$basic_string st d DV?$char_traits std D 1 V?$allocator std D 1 std (void syscall Awesomium::We bView::loadURL(basic_string<>::d::DV?$char_traits::std::D::WebView const &,alloc ator<>::d::D::WebView )) dawesome.obj(dawesome) Error 42: Symbol Undefined ?setCustomResponsePage WebCore Awesomium QAEXHABV?$ basic_string std DV?$char_traits std D 1 V?$allocator std D 1 std (void syscal l Awesomium::WebCore::setCustomResponsePage(int ,basic_string<>::d::DV?$char_tra its::std::D::WebCore const &,allocator<>::d::D::WebCore )) dawesome.obj(dawesome) Error 42: Symbol Undefined ?setBaseDirectory WebCore Awesomium QAEXABV?$basic_ string std DV?$char_traits std D 1 V?$allocator std D 1 std (void syscall Awes omium::WebCore::setBaseDirectory(basic_string<>::d::DV?$char_traits::std::D::Web Core const &,allocator<>::d::D::WebCore )) --- errorlevel 3 I'm very new to D and was always more a C guy than a C++ guy, so I'm really not sure where in the chain I might have gone wrong. Here are my files: dawesome.h ----------------------------------------------- #ifndef __DAWESOME_H__ #define __DAWESOME_H__ extern "C" { struct listen_funcs { void (*onBeginNavigation)(const char* url); void (*onBeginLoading)(const char* url, int statusCode, const wchar_t* mimeType); void (*onFinishLoading)(); void (*onReceiveTitle)(const wchar_t* title); void (*onChangeTooltip)(const wchar_t* tooltip); void (*onChangeKeyboardFocus)(int isFocused); }; int dawesome_init(struct listen_funcs* l_funcs, const char* baseDir, int width, int height); void dawesome_cleanup(); void dawesome_setCustomResponsePage(int statusCode, const char* filePath); void dawesome_loadURL(const char* url); void dawesome_loadHTML(const char* html); void dawesome_loadFile(const char* path); void dawesome_render(unsigned char* destination, int destRowSpan, int destDepth); void dawesome_resize(int width, int height); } #endif ----------------------------------------------- dawesome.cpp ----------------------------------------------- #include "dawesome.h" #include "WebCore.h" #include <string> using namespace Awesomium; class MyListener : public WebViewListener { private: struct listen_funcs* my_listener; public: MyListener(struct listen_funcs* listener) { my_listener = listener; } void onBeginNavigation(const std::string& url) { if (my_listener->onBeginNavigation != NULL) { my_listener->onBeginNavigation(url.c_str()); } } void onBeginLoading(const std::string& url, int statusCode, const std::wstring& mimeType) { if (my_listener->onBeginLoading != NULL) { my_listener->onBeginLoading( url.c_str(), statusCode, mimeType.c_str() ); } } void onFinishLoading() { if (my_listener->onFinishLoading != NULL) { my_listener->onFinishLoading(); } } void onCallback(const std::string& name, const Awesomium::JSArguments& args) {} void onReceiveTitle(const std::wstring& title) { if (my_listener->onReceiveTitle != NULL) { my_listener->onReceiveTitle(title.c_str()); } } void onChangeTooltip(const std::wstring& tooltip) { if (my_listener->onChangeTooltip != NULL) { my_listener->onChangeTooltip(tooltip.c_str()); } } void onChangeCursor(const HCURSOR& cursor) {} void onChangeKeyboardFocus(bool isFocused) { if (my_listener->onChangeKeyboardFocus != NULL) { my_listener->onChangeKeyboardFocus( isFocused ? 1 : 0 ); } } }; //------------- WebCore* core; WebView* view; MyListener* listener; int dawesome_init(struct listen_funcs* l_funcs, const char* baseDir, int width, int height) { std::string str(baseDir); core = new WebCore(LOG_VERBOSE); core->setBaseDirectory(str); view = core->createWebView(width, height, false, true, 70); if (view == NULL) return 0; listener = new MyListener(l_funcs); view->setListener(listener); return 1; } void dawesome_cleanup() { view->destroy(); delete core; delete listener; } void dawesome_setCustomResponsePage(int statusCode, const char* filePath) { std::string str(filePath); core->setCustomResponsePage(statusCode, str); } void dawesome_loadURL(const char* url) { std::string str(url); view->loadURL(str, "", ""); } void dawesome_loadHTML(const char* html) { std::string str(html); view->loadURL(str); } void dawesome_loadFile(const char* path) { std::string str(path); view->loadURL(str); } void dawesome_render(unsigned char* destination, int destRowSpan, int destDepth) { view->render(destination, destRowSpan, destDepth, 0); } void dawesome_resize(int width, int height) { view->resize(width, height); } ----------------------------------------------- dawesome.di ----------------------------------------------- extern (C) { struct listen_funcs { void (*onBeginNavigation)(char* url); void (*onBeginLoading)(char* url, int statusCode, wchar* mimeType); void (*onFinishLoading)(); void (*onReceiveTitle)(wchar* title); void (*onChangeTooltip)(wchar* tooltip); void (*onChangeKeyboardFocus)(int isFocused); } int dawesome_init(listen_funcs* l_funcs, char* baseDir, int width, int height); void dawesome_cleanup(); void dawesome_setCustomResponsePage(int statusCode, char* filePath); void dawesome_loadURL(char* url); void dawesome_loadHTML(char* html); void dawesome_loadFile(char* path); void dawesome_render(ubyte* destination, int destRowSpan, int destDepth); void dawesome_resize(int width, int height); } -----------------------------------------------
Apr 03 2009