J'ai reçu une bibliothèque ah strong>: p> AC fort>: p> La bibliothèque a été compilée comme ceci (supposer que tous les fichiers de ces exemples sont dans le même répertoire pour la simplicité).: p> A code> qui attend là une fonction
B () code> mais ne le met pas en œuvre. On dirait que ceci (je ne peux pas changer ce code):
.//liba.so: undefined reference to `b'
collect2: error: ld returned 1 exit status
3 Réponses :
Alors que le tapis a souligné, je négligais simplement d'inclure la source B_V2.C dans l'étape de compilation. Cela fonctionne:
gcc main_v3.c b_v2.c -L ./ -la -o main
Comment va-t-il différent de mon premier exemple de travail dans MAIN_V2.C? P>
dans la version 3, aucune implémentation de
B () code> est même compilée, beaucoup moins liée dans l'exécutable final. Une déclaration seule n'est pas suffisante et comprenant un en-tête est complètement indépendant de compiler ou de relier un fichier source associé. P>
Notez que votre
AC code> a exactement autant qu'une déclaration de < code> B () code> comme
MAIN_V3.C CODE> acquiert à partir de
BH code>, donc si rien dans
Main_v3.c code> appelle cette fonction, puis Cet en-tête n'ajoute rien de nouveau ou utile. P>
Y a-t-il un moyen d'accomplir cela sans créer une bibliothèque séparée pour B ()? P> BlockQuote>
Bien sûr, plusieurs. Mais le plus facile à utiliser pour vous d'utiliser pourrait être de nommer les deux fichiers source C sur la même ligne de commande de compilation: p>
xxx pré> notez que j'ai choisi
main_v1 < / code> intentionnellement: étant donné que rien dans l'appels de fichiers
B () code>, il n'est pas utile pour une déclaration de cette fonction apparaître dans le fichier, que ce soit directement ou via l'inclusion d'en-tête. P> < / blockquote>
ah alim p> bc p> compile P> $> ./a.out
Dans votre dernier exemple, lorsque vous compilez tout ce qui a la définition (non déclaration) pour
B () code>?
C'était ça! Ceci fait i> travaille, je venais d'oublier d'inclure B_V2.c dans l'étape de compilation. Il devrait ressembler à ceci:
gcc MAIN_V3.C B_V2.C -L -L ./ -La -o principal code>