Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Creazione libreria dinamica in ambiente linux

    Salve a tutti!

    Sono nuovo del forum, e anche un principiante programmatore :P

    Sto sviluppando un progetto in C++, praticamente devo creare una libreria dinamica in ambiente linux, che contiene diversi metodi al suo interno, e che vorrei richiamare da uno script in python.

    So che da python è possibile importare librerie sviluppate in c/c++ attraverso il crossplatform ctypes, tramite le seguenti righe di comando:

    codice:
    from ctypes import *
    test = cdll.LoadLibrary("./lib_bla_bla.so")
    Ora, la creazione della libreria l'ho fatta utilizzando eclipse come IDE. Ho creato un progetto con il formato di shared library, al cui interno ho creato una cartella sorgente contenente l'header file ed il sorgente *.cpp.
    Ho specificato tra le opzioni del compilatore:

    -shared

    -fPIC

    La build del progetto va a buon fine e mi crea il file .so all'interno della cartella debug. Da shell entro in tale cartella, lancio python da riga di comando ed importo il modulo ctypes, caricando la libreria come ho scritto sopra. Quello che ottengo però come risultato quando cerco di chiamare una delle funzioni incluse nel mio file, è che non riconosce il nome delle funzioni come dichiarato all'interno della libreria.

    Lo stesso, se invece di cercare di caricare la mia libreria, ne carico una di sistema, ovviamente tutto funziona....

    Qualcuno saprebbe darmi una mano o indicarmi dei buoni tutorial che spieghino come creare una libreria dinamica C++ su linux , magari con eclipse (o con un IDE piu adatto comunque), e come richiamare poi le funzioni da python?

    Grazie a tutti in anticipo.

    Eightstrings.

  2. #2
    Qualcuno saprebbe darmi una mano o indicarmi dei buoni tutorial che spieghino come creare una libreria dinamica C++ su linux
    Certo
    Quello che ottengo però come risultato quando cerco di chiamare una delle funzioni incluse nel mio file, è che non riconosce il nome delle funzioni come dichiarato all'interno della libreria
    comunque é molto probabile che non hai settato la variabile d'ambiente LD_LIBRARY_PATH o qualcosa di simile.
    Qui per primo
    Qui
    Qui
    Comunque in questi tutorial é specificato tutto. Spero di esserti stato d'aiuto.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315

    Re: Creazione libreria dinamica in ambiente linux

    Originariamente inviato da eightstrings
    Sto sviluppando un progetto in C++
    La prossima volta, specificalo nel titolo, come da Regolamento interno.

    Ho aggiunto io questa informazione nel titolo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Perfetto,

    chiedo scusa per la imprecisione nel mio titolo, grazie per l'avviso cercherò di fare piu attenzione

    E grazie anche per i suggerimenti dei link me li studierò per bene, di sicuro saranno di aiuto!

    A presto.

    Eightstrings.

  5. #5

    [C++/Python] Creazione libreria dinamica in ambiente linux

    Ok ho letto le guide che mi avete consigliato e le ho trovate molto utili, ma continuo ad avere problemi con la mia libreriola, continuo a non capire se la richiamo male da python, o se continua a sfuggirmi qualcosa.

    Ho proceduto nel seguente modo.

    Ho creato un file sorgente molto semplice con una funzione al suo interno:

    codice:
    #include <iostream>
    #include <iostream>
    #include <string>
    #include <cstdlib>
    
    using namespace std;
    
    void pippo() {
    	cout << "Tempo: " << endl;
    }
    codice di per se molto semplice.

    A questo punto mi sono rifatto alla guida presente nel secondo link ed ho creato la libreria statica nella maniera indicata.

    La domanda ora è, una volta creato lo shared object, le funzioni dichiarate nel suo sorgente dovrebbero essere accessibili?

    In pratica ho popolato la variabile LD_LIBRARY_PATH con il path agli so della mia libreria (li ho messi in opt/bin), e sono entrato da python per riprovare:



    codice:
    >>> from ctypes import *
    >>> test = cdll.LoadLibrary("libdintest.so.1")
    >>> print test.pippo
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python2.6/ctypes/__init__.py", line 366, in __getattr__
        func = self.__getitem__(name)
      File "/usr/lib/python2.6/ctypes/__init__.py", line 371, in __getitem__
        func = self._FuncPtr((name_or_ordinal, self))
    AttributeError: /opt/lib/libdintest.so.1: undefined symbol: pippo
    >>> export
    cos'altro puo mancare?

    Ho seguito diversi tutorial, ma non riesco ad estrarne il punto cruciale.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.