Shared library, dziedziczenie, Linux dziala, Windows: undefined reference to...
Ostatnio zmodyfikowano 2019-04-09 21:35
PLGoldenPL Temat założony przez niniejszego użytkownika |
Shared library, dziedziczenie, Linux dziala, Windows: undefined reference to... » 2019-04-08 20:13:31 Witam, mam problem z biblioteka wspoldzielona. Otoz na Linuxie kompiluje sie i dziala prawidlowo (z uzyciem tylko pliku naglowkowego klasy A w bibliotece), zas na Windowsie do wszystkich metod klasy A, wyskakuje "undefined reference to". Niekompilujacy sie Windows: #include "B.hpp"
extern "C" { A * __declspec( dllexport ) n() { return new B(); } void __declspec( dllexport ) d( A * b ) { delete b; } }
||In function `ZN1BD4Ev':| |7|undefined reference to `A::~A()'| ||In function `ZN1BC2Ev':| |3|undefined reference to `A::A()'| ||In function `ZN1BD2Ev':| 7|undefined reference to `A::~A()'| (.rdata$_ZTV1B[__ZTV1B]+0x10)||undefined reference to `A::get()'| ||error: ld returned 1 exit status| Dzialajacy kod Linux: #include "/home/user01 #include "B.hpp"
extern "C" { A * n() { return new B(); } void d( A * b ) { delete b; } }
#ifndef B_HPP_INCLUDED #define B_HPP_INCLUDED
#include "/home/user01
class B : public A { public: B(); virtual ~B(); };
#endif
#include "B.hpp"
B::B() { }
B::~B() { }
#ifndef A_HPP_INCLUDED #define A_HPP_INCLUDED
class A { public: A(); virtual ~A(); virtual int get(); };
#endif
#include "A.hpp"
A::A() { }
A::~A() { }
int A::get() { return 6; }
#include "A.hpp"
#include <iostream> #include <dlfcn.h>
int main() { void * dl = dlopen( "/home/user01/Dokumenty/CBP/LIB/bin/Debug/libB.so", RTLD_LAZY ); if( !dl ) { std::cout << dlerror() << std::endl; return 1; } typedef A *( * FN )(); typedef A *( * FD )( A * ); FN fn =( FN ) dlsym( dl, "n" ); FD fd =( FD ) dlsym( dl, "d" ); if( !fn ) { std::cout << dlerror() << std::endl; return 2; } if( !fd ) { std::cout << dlerror() << std::endl; return 3; } A * a = fn(); std::cout << a->get() << std::endl; fd( a ); a = NULL; return 0; }
Wrazie co ladowanie biblioteki w Windowsie: #include "A.hpp"
#include <iostream> #include <windows.h>
int main() { typedef A *( * FN )(); typedef A *( * FD )( A * ); HINSTANCE hDll = LoadLibrary( "B.dll" ); if( !hDll ) return 1; FN n =( FN ) GetProcAddress( hDll, "n" ); FD d =( FD ) GetProcAddress( hDll, "d" ); if( !n ) return 2; if( !d ) return 3; A * obj = n(); std::cout << obj->get() << std::endl; d( obj ); return 0; }
|
|
pekfos |
» 2019-04-09 11:07:04 Podaj log kompilacji. |
|
PLGoldenPL Temat założony przez niniejszego użytkownika |
» 2019-04-09 17:03:28 -------------- Build: Debug in LIB (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -shared -Wl,--output-def=bin\Debug\libLIB.def -Wl,--out-implib=bin\Debug\libLIB.a -Wl,--dll obj\Debug\B.o obj\Debug\main.o -o bin\Debug\libLIB.dll obj\Debug\B.o: In function `ZN1BD4Ev': D:/LIB/B.cpp:7: undefined reference to `A::~A()' obj\Debug\B.o: In function `ZN1BC2Ev': D:/LIB/B.cpp:3: undefined reference to `A::A()' obj\Debug\B.o: In function `ZN1BD2Ev': D:/LIB/B.cpp:7: undefined reference to `A::~A()' obj\Debug\B.o:B.cpp:(.rdata$_ZTV1B[__ZTV1B]+0x10): undefined reference to `A::get()' collect2.exe: error: ld returned 1 exit status Process terminated with status 1 (0 minute(s), 0 second(s)) 5 error(s), 0 warning(s) (0 minute(s), 0 second(s)) |
|
pekfos |
» 2019-04-09 17:21:37 Nie ma A.o. |
|
PLGoldenPL Temat założony przez niniejszego użytkownika |
» 2019-04-09 17:36:03 Z A.o skompilowalo sie, ale teraz w chwili gdy chce wyswietlic wartosc zwracana przez metode get() program przestaje dzialac. |
|
pekfos |
» 2019-04-09 18:10:24 typedef A *( * FD )( A * );
|
To nie jest poprawny typ dla funkcji d(). |
|
PLGoldenPL Temat założony przez niniejszego użytkownika |
» 2019-04-09 18:14:47 Faktycznie, pomylilem sie w funkcji FD, ale program wysypuje sie przed jej wykonanienm: std::cout << obj->get() << std::endl; |
|
pekfos |
» 2019-04-09 18:57:29 "U mnie działa". Co pokazuje debugger? |
|
« 1 » 2 |