Help binding over to C++

Jason House jason.james.house at gmail.com
Fri Apr 3 09:43:13 PDT 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 at WebView@Awesomium@@QAEXABV?$basic_string at st
> d at DV?$char_traits at std@D at 1@V?$allocator at std@D at 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 at WebCore@Awesomium@@QAEXHABV?$
> basic_string at std@DV?$char_traits at std@D at 1@V?$allocator at std@D at 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 at WebCore@Awesomium@@QAEXABV?$basic_
> string at std@DV?$char_traits at std@D at 1@V?$allocator at std@D at 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);
> 
> }
> -----------------------------------------------




More information about the Digitalmars-d mailing list