Usare librerie C da codice C++

misc41.jpg

Recentemente ho avuto bisogno di usare delle librerie scritte in C da codice C++, esiste un piccolo trucchetto per fare contento il linker. In questo post presenterò un esempio molto banale ma sufficiente per chiarire la procedura.

Iniziamo con una libreria C con una funzione somma che banalmente effettua l’addizione di due interi:

libtest.c

#include "libtest.h"

int somma(int a, int b) 
{
        return (a + b);
}

libtest.h

#ifndef _LIBTEST_H_
#define _LIBTEST_H_

int somma(int a, int b);

#endif

ora compiliamo la libreria così:

gcc -shared libtest.c -o libtest.so

In questo modo abbiamo una libreria utilizzabile da altri sorgenti C, ma il nostro intento è utilizzare somma da codice C++. Ecco un esempio di come strutturare il codice per poter utilizzare una funzione inclusa in una libreria C.

somma.cpp

#ifdef __cplusplus
extern "C" {
#endif
#include "libtest.h"
#ifdef __cplusplus
}
#endif

#include <iostream>

int main(int argc, char **argv)
{

	int j = 5;
	int k = 2;

	std::cout << somma(j, k) << std::endl;

	return 0;

}

e compiliamo così:

g++ somma.cpp -ltest -L. -I. -o somma

L’eseguibile avrà bisogno di trovare la libreria quindi occorrerà specificare il PATH dove risiede libtest.so:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`

Provate a lanciare il programmino somma e se tutto è andato a buon fine dovrebbe restituirvi il risultato di (5 + 2).

2 pensieri su “Usare librerie C da codice C++

  1. Vero. Ma per non sporcare troppo il sorgente C++, e soprattutto per evitare di ripetere righe se si sta usando la libreria in più di un sorgente, conviene di più una libtest.h così:


    #ifdef __cplusplus
    extern "C" {
    #endif

    #ifndef _LIBTEST_H_
    #define _LIBTEST_H_

    int somma(int a, int b);

    #endif
    #ifdef __cplusplus
    }
    #endif

    Comunque ottimo blog, vai dritto sul mio blogroll🙂

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...