Sziasztok!
Az alaphelyzet a következő:
Szeretnék osztályokat exportálni egy .so fájlból. Utánanéztem és találtam is rá megoldást, de van egy kis gondom.
(Már egy napja szenvedek vele :) )
A hívó applikáció forrása:
TestClass.h:
class TestClass
{
public:
TestClass();
virtual ~TestClass();
virtual void Kiir();
};
TestClass.cc:
#include "TestClass.h"
void
TestClass::Kiir() {
std::cout << "Os OSztaly!" << std::endl;
}
main.cc:
#include <gtkmm.h>
#include "TestClass.h"
typedef TestClass* (*func)();
typedef void (*func2)(TestClass* p);
int main()
{
Glib::Module module("/home/neuro/Projects/libem/src/.libs/liblibem.so.0.0.0");
std::cout << Glib::Module::get_last_error() << std::endl;
TestClass* ret;
func test;
func2 test2;
module.get_symbol("test",(void*&)test);
module.get_symbol("Del",(void*&)test2);
ret = test();
ret->Kiir();
test2(ret);
return 0;
}
A lib forrása pedig a következő:
InhTest.h:
#include "../include/TestClass.h"
class InhTest : public TestClass {
public:
InhTest() {};
virtual ~InhTest() {};
virtual void Kiir();
};
main.cc:
extern "C" {
TestClass* test() {
return new InhTest;
};
void Del(TestClass* p) {
delete (InhTest*) p;
};
};
A két projekt teljesen le van egymástól szeparálva, azaz nem ugyanazt a TestClass.h-t használják, ha ez egyáltalán lényeges.
Ha az InhTest osztály Kiir() metódusát egy külön .cc fájlban fejtem ki, akkor
/home/neuro/Projects/libem/src/.libs/liblibem.so.0.0.0: undefined symbol: _ZTVN5Test37InhTestE
(process:11484): GModule-CRITICAL **: g_module_symbol: assertion `module != NULL' failed
(process:11484): GModule-CRITICAL **: g_module_symbol: assertion `module != NULL' failed
Program has been terminated receiving signal 11 (Segmentation fault)
Hibaüzenetet kapom, amiben csak az első sor az érdekes.
Ha a headerben, akkor hiba nélkül lefut a dolog.
g++-ről:
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --enable-checking=release x86_64-linux-gnu
Thread model: posix
gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
Szóval a kérdésem az, hogy van-e valami megoldás arra, hogy ne kelljen mindent a headerben kifejtenem ahhoz, hogy fusson? Esetleg máshogy kéne a gcc-t fordítani, vagy az a bizonyos nem implementált 'export' kulcsszó, ami hiányzik? - Mert a template-eknél is valami hasonló névfeloldási problémákkal küszködik a gcc. (Amúgy a IDE-nek az Anjuta-át használom, a hívó app-ot egy gtkmm-2.0 template-ből generáltam, a lib egy sima console-os alkalmazás C++-ban, a cél pedig egy dinamikusan csatolható konyvtár.)
A google-n néztem, de a példákban nem említették (vagy én voltam figyelmetlen), hogy ilyen gond lenne, mármint hogy nem osztható ketté a lib forrása.
Illetve ehhez kapcsolódóan lenne még egy kérdésem, hogy nincs-e a Visual Studio __declspec(dllexport)-éhez hasonló megoldás Linuxra?
Előre is köszönöm a segítséget!