Tworzenie własnej biblioteki .so
Ostatnio zmodyfikowano 2013-10-20 18:09
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] #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] #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ę ? |
|
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. |
|
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 ? |
|
pekfos |
» 2013-10-20 14:03:30 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. |
|
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 :) |
|
« 1 » |