Domanda

EDIT: suppongo che dovrei chiarire, nel caso in cui sia importante. Sono su una scatola Unix AIX, quindi sto usando compilatori VAC - nessun compilatore GNU. Termina modifica


Sono abbastanza arrugginito in C / C ++, quindi perdonami se questa è una domanda semplice.

Vorrei estrarre funzioni comuni da alcuni dei miei programmi C e inserirle in librerie condivise o oggetti condivisi. Se lo facessi in perl, metterei i miei sottotitoli in un modulo perl e userei quel modulo quando necessario.

Per fare un esempio, supponiamo che io abbia questa funzione:

int giveInteger()
{
    return 1034;
}

Ovviamente questo non è un esempio del mondo reale, ma se volessi condividere quella funzione, come procederei?

Sono abbastanza sicuro di avere 2 opzioni:

  1. Metti la mia funzione condivisa in un file e fallo compilare con il mio programma principale al momento della compilazione. Se dovessi mai apportare modifiche alla mia funzione condivisa, avrei dovuto ricompilare il mio programma principale.
  2. Metti la mia funzione condivisa in un file e compilarla come libreria condivisa (se ho i miei termini corretti) e avere il mio collegamento principale del programma a quella libreria condivisa. Qualsiasi modifica apportata alla mia libreria condivisa (dopo averla compilata) verrebbe integrata nel mio programma principale in fase di esecuzione senza ricompilare il mio programma principale.

Ho ragione su questo pensiero?

In tal caso, come posso rispettare uno / entrambi questi metodi? Ho cercato molto e mi sembra di trovare informazioni su come potrei avere il mio programma collegato alla libreria condivisa di qualcun altro, ma non come creare le mie funzioni condivise e compilarle in un modo in cui posso usarle nel mio programma .

Grazie mille!

Brian


MODIFICA:

Conclusione

Grazie a tutti per il vostro aiuto! Ho pensato di aggiungere a questo post ciò che funziona per me (per le librerie dinamiche condivise su AIX) in modo che altri possano trarne vantaggio:

Compilo le mie funzioni condivise:

xlc -c sharedFunctions.c -o sharedFunctions.o

Quindi rendilo un oggetto condiviso:

xlc -qmkshrobj -qexpfile=exportlist sharedFunctions.o
xlc -G -o libsharedFunctions.so sharedFunctions.o  -bE:exportlist

Quindi collegalo a un altro programma:

xlc -brtl -o mainProgram mainProgram.c  -L. -lsharedFunctions

E un altro commento mi ha aiutato a trovare questo link, che ha anche aiutato: http: //publib.boulder.ibm.com/infocenter/comphelp/v7v91/topic/com.ibm.vacpp7a.doc/proguide/ref/compile_library.htm

Grazie ancora a tutti coloro che mi hanno aiutato!

È stato utile?

Soluzione

Sì, hai ragione. Il primo è chiamato libreria statica , mentre il secondo è chiamato libreria condivisa , perché il codice non è associato all'eseguibile in fase di compilazione, ma di nuovo quando il programma è caricato.

Libreria statica

Compila il codice della tua libreria come segue:

gcc -c *.c

Il -c dice al programma di non collegare il file oggetto, ma ti lascia solo con i file oggetto per ogni file .c che è stato compilato. Ora, archiviali in una libreria statica:

ar rcs libmystuff.a *.o 

man ar ti dirà cosa significano le opzioni rcs. Ora, libmystuff.a è un file un rchive (puoi aprirlo con alcuni visualizzatori di file zip) che contengono quei file oggetto, insieme a un indice di simboli per ciascun file oggetto. Puoi collegarlo al tuo programma:

gcc *.c libmystuff.a -o myprogram

Ora il tuo programma è pronto. Si noti che l'ordine di visualizzazione delle librerie statiche nell'argomento comando. Vedi la mia Ordine link .

Libreria condivisa

Per una libreria condivisa, creerai la tua libreria con

gcc -shared -o libmystuff.so *.c

Questo è tutto ciò che serve, libmystuff.so ora è un file di oggetto s hared o . Se vuoi collegare un programma ad esso, devi metterlo in una directory che è elencata nel file /etc/ld.so.conf , o che è data dal - L passa a GCC o elencato nella variabile LD_LIBRARY_PATH. Quando si collega, si taglia il prefisso lib e il suffisso .so dal nome della libreria che si dice a gcc.

gcc -L. -lmystuff *.c -o myprogram

Internamente, gcc passerà i tuoi argomenti al linker GNU. Puoi vedere quali argomenti passa usando l'opzione - ### : Gcc stamperà gli argomenti esatti dati a ciascun processo secondario.

Per dettagli sul processo di collegamento (come alcune cose sono fatte internamente), guarda il mio Linker GCC Linux risposta.

Altri suggerimenti

Hai una terza opzione. In generale, il compilatore C ++ dovrebbe essere in grado di collegare le routine C. Le opzioni necessarie possono variare da compilatore a compilatore, quindi R va bene M, ma in sostanza, dovresti essere in grado di compilare con g ++ come qui:

$ g++ -o myapp myapp.cpp myfunc.c giveint.c

... o compila separatamente

$ gcc -c myfunc.c
$ gcc -c giveint.c
$ g++ -c myapp.cpp
$ g++ -o myapp myapp.o myfunc.o

È inoltre necessario includere la dichiarazione delle funzioni; lo fai in C ++ come

extern "C" {
    int myfunc(int,int);
    int giveInterger(void);
}

Devi distinguere tra ricompilazione e ricollegamento.

Se metti giveInteger () in una libreria (archivio) separata e poi la modifichi in seguito, dovrai (ovviamente) ricompilare il file sorgente in cui è definito e < em> ricollega tutti i programmi che lo utilizzano; ma non dovrai ricompilare tali programmi [1].

Per una libreria condivisa, dovrai ricompilare e ricollegare la libreria; ma non dovrai ricollegare o ricompilare nessuno dei programmi che lo utilizzano.

Compilare le librerie condivise C ++ su AIX era complicato; dovevi usare lo script della shell di MakeC ++ SharedLib. Ma con VAC 5.0 e 6.0 è diventato abbastanza facile. Credo che tutto ciò che devi fare sia [2]:

xlC -G -o shr.o giveInteger.cc
xlC -o myapp main.cc shr.o

[1] Se scrivi Makefile corretto (che è una pratica consigliata), tutto ciò accadrà automaticamente quando scrivi make .

[2] Esiste una certa funzione di AIX che può complicare le cose: per impostazione predefinita le librerie condivise vengono caricate in memoria e " stick " lì fino al successivo riavvio. Quindi puoi ricostruire lo shr.o, rieseguire il programma e osservare "vecchio". versione della libreria in esecuzione. Per evitare ciò, una pratica comune è quella di rendere illeggibile illeggibile dal mondo:

chmod 0750 shr.o
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top