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

Tworzenie własnej biblioteki .so

Ostatnio zmodyfikowano 2013-10-20 18:09
Autor Wiadomość
Narzew
Temat założony przez niniejszego użytkownika
Tworzenie własnej biblioteki .so
» 2013-10-19 19:55:57
Witam.
Spróbowałem zgodnie z poniższym poradnikiem, stworzyć własną bibliotekę .so . Jednak mam problem, gdyż pomimo iż zdefiniowałem funkcję, mam niewłaściwą liczbę argumentów (skompilowało się ok z atrybutem -ldl), ale przy uruchomieniu calla z tejże biblioteki mam błąd że niewłaściwa liczba argumentów, mimo iż wywołałem z poprawną liczbą.
http://4programmers.net/C/Artyku%C5%82y/Linux_-_Biblioteki_%C5%82adowane_dynamicznie

Kod : [ncp.cpp]

C/C++
#include <cstdlib>
#include <iostream>

extern "C" int randomize( int min, int max ) {
    return( rand() %( max -( min - 1 ) ) + min );
}

extern "C" void clearcin() {
    cin.clear();
    cin.ignore( numeric_limits < streamsize >::max(), '\n' );
}

Kod : [ncpsample.cpp]

C/C++
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <dlfcn.h>

using namespace std;

int main( void )
{
    void * loader = dlopen( "./ncp.so", RTLD_LAZY );
    if( !loader ) {
        printf( "Error: %s\n", dlerror() );
        return 1;
    }
    typedef int( * Randomize )();
    typedef void( * ClearCin )();
   
    Randomize randomize =( Randomize ) dlsym( loader, "randomize" );
    ClearCin clearcin =( ClearCin ) dlsym( loader, "clearcin" );
   
    if(( !randomize ) ||( !clearcin ) ) {
        printf( "Error: %s\n", dlerror() );
        return 2;
    }
   
    srand( time( NULL ) );
    cout << "6 losowych liczb od 1 do 100: \n";
    for( int i = 0; i < 6; i++ ) {
        cout << randomize( 1, 100 ) << endl;
    }
   
    dlclose( loader );
    return 0;
}

Co robie źle i jak to naprawić, bym mógł dynamicznie wykonywać funkcje z innych libów, które sam w przyszłości zrobię ?
P-94064
DejaVu
» 2013-10-20 13:56:09
Tworząc biblioteki musisz mieć pliki *.hpp/*.h oraz *.cpp/*.c. Pliki *.h zawsze się dołącza do projektu, w którym chcesz wykorzystać zbudowaną bibliotekę. Zawartość plików *.cpp/*.c jest kompilowana i z nich powstaje biblioteka. Ty masz same pliki *.cpp, więc czegokolwiek byś nie robił to i tak otrzymany efekt końcowy będzie niepoprawny.
P-94114
Narzew
Temat założony przez niniejszego użytkownika
Tworzenie włąsnej biblioteki .so
» 2013-10-20 14:02:28
Jaką treść musiałby mieć plik ncp.hpp by ta biblioteka, co przedstawiłem działała ?
P-94115
pekfos
» 2013-10-20 14:03:30
C/C++
typedef int( * Randomize )( int, int );

DejaVu:
To nie ma znaczenia. Nagłówki są tylko po to, by nie pisać ręcznie wszystkich deklaracji, gdy używa się biblioteki przy normalnym linkowaniu. Do ręcznego załadowania biblioteki to nie jest potrzebne.
P-94116
DejaVu
» 2013-10-20 18:09:12
No tak - masz rację. Nie zwróciłem uwagi na to, że w kodzie wczytywana jest biblioteka dynamicznie, a nie linkerem :)
P-94133
« 1 »
  Strona 1 z 1