Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Shared library, dziedziczenie, Linux dziala, Windows: undefined reference to...

Ostatnio zmodyfikowano 2019-04-09 21:35
Autor Wiadomość
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:
C/C++
//main.cpp
#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:
C/C++
//main.cpp
#include "/home/user01 //Dokumenty/CBP/SO/A.hpp"
#include "B.hpp"

extern "C"
{
    A * n()
    {
        return new B();
    }
    void d( A * b )
    {
        delete b;
    }
}
C/C++
//B.hpp
#ifndef B_HPP_INCLUDED
#define B_HPP_INCLUDED

#include "/home/user01 //Dokumenty/CBP/SO/A.hpp"

class B
    : public A
{
public:
    B();
    virtual ~B();
    //virtual int get();
};

#endif // B_HPP_INCLUDED
C/C++
//B.cpp
#include "B.hpp"

B::B()
{
}

B::~B()
{
}
/*
int B::get()
{
    return 9;
}
*/
C/C++
//A.hpp
#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED

class A
{
public:
    A();
    virtual ~A();
    virtual int get();
};

#endif // A_HPP_INCLUDED
C/C++
//A.cpp
#include "A.hpp"

A::A()
{
}

A::~A()
{
}

int A::get()
{
    return 6;
}

C/C++
//main.cpp
#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:
C/C++
//main.cpp
#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;
}
P-174353
pekfos
» 2019-04-09 11:07:04
Podaj log kompilacji.
P-174357
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))
P-174363
pekfos
» 2019-04-09 17:21:37
Nie ma A.o.
P-174364
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.
P-174366
pekfos
» 2019-04-09 18:10:24
C/C++
typedef A *( * FD )( A * );
To nie jest poprawny typ dla funkcji d().
P-174367
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;
P-174368
pekfos
» 2019-04-09 18:57:29
"U mnie działa". Co pokazuje debugger?
P-174369
« 1 » 2
  Strona 1 z 2 Następna strona