2017-08-24 2 views
1

Alors maintenant, j'ai un arbre de programmes qui contientConstruire un fichier .so à partir de plusieurs fichiers C++ et utiliser

outter.cc, outter.h b.cc, b.h c.cc, c.h

et chacun de ces .cc fichiers ressembler à ceci:

outter.cc:

#include "b.h" 
// do something 

b.cc

#include "c.h" 
// do something 

c.cc

//do something 

En outer.cc est un tas de définitions de l'API. Je veux générer un fichier .so afin que d'autres personnes puissent utiliser mon API lorsqu'ils lient leurs programmes avec ce fichier .so.

donc mes questions:

  1. Comment générer ce fichier .so? Je suis fondamentalement "emballage" tout le code dans un fichier .so

  2. Si j'ai réussi à générer ce fichier .so, comment l'utiliser? Dites que j'ai un fichier main.cc dans un autre répertoire /home/xavier/test/ et j'ai aussi le fichier .so généré en /home/xavier/test/. Comment dois-je écrire ce main.cc et comment dois-je compiler ce fichier main.cc pour qu'il utilise mon API défini dans outter.cc?

J'utilise Mac OS X et g ++

Merci!

Répondre

1

Un makefile comme suit:

all:a.so 

a.so: outer.o b.o c.o 
    g++ $^ -fPIC -shared -o [email protected] 
%.o:%.cc 
    g++ $< -I(your header file path) -c -o [email protected] 

Ne pas oublier le drapeau -c lors de la génération des fichiers .o

si le liba.so dans le même dossier avec main.cc vous pouvez

g++ main.cc -la -o main 

le main.cc devrait inclure outter.h bh ch

ou vous renommez a.so à liba.so puis Dans le cas/usr/lib/ et exécutez g++ main.cc -la -o main

+0

Et si l'API 'outer.h' est conçue pour cacher les internes et les types de' bh' et 'ch', alors main.cc n'aura besoin que de' #include '. –

+0

Merci pour votre réponse! Encore une question! Que faire si 'b.h, c.h' et' outter.h' ont un répertoire différent? Que dois-je faire avec le '-I (votre chemin de fichier d'en-tête)'? – Xavier

+0

@ConradParker Merci pour vos commentaires. Oui 'outter.h' est censé cacher les détails de' b.h' et 'c.h' aux utilisateurs de l'API. Mais pouvez-vous être plus précis sur "conçu pour cacher les internes et les types"? Un exemple serait génial. – Xavier