Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


Luabind inside a Shared Library


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 Kyan   Members   -  Reputation: 395

Like
2Likes
Like

Posted 30 April 2012 - 09:37 AM

So, I've got Luabind et. al. setup properly and I'm trying to use it to fuel a binary extension module for Lua (i.e. a module for Lua written in C/C++). Unfortunately, it's been a long time since I've done anything C++ related and, frankly, I'm failing miserably. I've managed to get the following basic example running:

// helloworld.cpp
#include <iostream>
#include <luabind>

void greet()
{
	std::cout << "hello world!\n";
}

// int luaopen_[libname] is the entry point
extern "C" int luaopen_libhelloworld(luaState* L)
{
	using namespace luabind;

	open(L);

	module(L)
	[
		def("greet", &greet),
	];

	return 0;
}
The above, when compiled into a .so, works as expected.

require 'libhelloworld'
greet()
-- prints "hello world!"
Unfortunately, chaos sets in when I attempt to bind a simple class, e.g.:
class Test
{
	public:
		Test();
	
		void say() { std::cout << "Inside a class!" << std::endl; }
};

...
		def("greet", &greet),
  
		class_<Test>("TestClass")
	   	 .def(constructor<>())
	   	 .def("say", &Test::say)
...
at which point the undefined symbols start flying as I try to load the library in Lua. Specifically:
  • ./libhelloworld.so: undefined symbol: _ZN4TestC1Ev
The literature on Lua binary modules appears to be archaic and almost every example I've come across is either in pure C or C-like C++ (e.g. the working example above). I realize the error is most likely caused by name mangling but I'm not sure how to resolve it. I investigated exporting symbols with GCC by using __attribute__((__visibility__("default"))), but that doesn't appear to have any effect. Some sparse documentation recommended appending -WI -E to the GCC arg list and that doesn't appear to have done much either (-E is just a preprocessor pass?).

The only other valid example I can find is the Ogre bindings to Lua (using Luabind) which doesn't use an entry point at all as far as I can tell. Unfortunately, I'm not entirely clear how they got away with that since anytime I try Lua - surprise - whines about not having a valid entry point.

I realize this should probably be elsewhere (like on the mailing list) but I was kind of hoping my problem was either obvious or a Luabind guru was somewhere nearby. Any help would be greatly appreciated.

EDIT: SOLVED. I forgot to define the constructor. *hangs head in shame* My apologies folks, this is precisely why sleep is important.

Edited by Kyan, 30 April 2012 - 09:56 AM.


Sponsor:

#2 thiagogcm   Members   -  Reputation: 106

Like
0Likes
Like

Posted 30 August 2012 - 02:48 PM

How did you compile it with g++ ?
I'm having a trouble here




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS