Liaison hiérarchique en C

Je veux lier trois fichiers, mais de manière hiérarchique.

// ac int fun1(){...} int fun2(){...} // bc extern int parameter; int fun3(){...//using parameter here} // main.c int parameter = 1; int main(){...// use fun1 fun2 fun3} 

Ainsi, j’ai d’abord compilé trois fichiers séparément dans le fichier object ao , bo et main.o Et puis je veux combiner ao et bo dans un autre fichier object tools.o . Et finalement, utilisez tools.o et main.o pour générer un fichier exécutable.

Mais, lorsque j’essaie de combiner ao et bo comme ld -o tools.o ao bo , l’éditeur de liens dit undefined reference to 'parameter' . Comment pourrais-je lier ces fichiers d’object dans un fichier d’object intermédiaire?

Vous voulez que l’option -r produise un fichier object déplaçable (pensez ‘réutilisable’):

 ld -o tools.o -r ao bo 

Code de travail

abmain.h

 extern void fun1(void); extern void fun2(void); extern void fun3(void); extern int parameter; 

ac

 #include  #include "abmain.h" void fun1(void){printf("%s\n", __func__);} void fun2(void){printf("%s\n", __func__);} 

avant JC

 #include  #include "abmain.h" void fun3(void){printf("%s (%d)\n", __func__, ++parameter);} 

principal c

 #include  #include "abmain.h" int parameter = 1; int main(void){fun1();fun3();fun2();fun3();return 0;} 

Compilation et exécution

 $ gcc -Wall -Wextra -c ac $ gcc -Wall -Wextra -c bc $ gcc -Wall -Wextra -c main.c $ ld -r -o tools.o ao bo $ gcc -o abmain main.o tools.o $ ./abmain fun1 fun3 (2) fun2 fun3 (3) $ 

Fourni sur Mac OS X 10.11.6 avec GCC 6.1.0 (et le chargeur Xcode 7.3.0, etc.). Cependant, l’option -r figure dans la commande ld sous Unix traditionnel depuis au moins la 7e édition d’Unix (vers 1978), de sorte qu’elle sera probablement disponible avec la plupart des systèmes de compilation basés sur Unix, même si c’est l’un des plus répandus. options largement inutilisées.