combine deux fichiers .o compilés par GCC dans un troisième fichier .o

Comment combine-t-on deux fichiers .o compilés par GCC dans un troisième fichier .o?

$ gcc -c ac -o ao $ gcc -c bc -o bo $ ??? ao bo -o co $ gcc co other.o -o executable 

Si vous avez access aux fichiers source, le drapeau -combine GCC fusionnera les fichiers source avant la compilation:

 $ gcc -c -combine ac bc -o co 

Cependant, cela ne fonctionne que pour les fichiers source, et GCC n’accepte pas les fichiers .o en entrée pour cette commande.

En règle générale, la liaison de fichiers .o ne fonctionne pas correctement, car vous ne pouvez pas utiliser la sortie de l’éditeur de liens comme entrée. Le résultat est une bibliothèque partagée et n’est pas lié statiquement à l’exécutable résultant.

 $ gcc -shared ao bo -o co $ gcc co other.o -o executable $ ./executable ./executable: error while loading shared libraries: co: cannot open shared object file: No such file or directory $ file co co: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not ssortingpped $ file ao ao: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not ssortingpped 

Passer -r (ou --relocatable ) à ld créera un object approprié comme entrée de ld .

 $ ld -r ao bo -o co $ gcc co other.o -o executable $ ./executable 

Le fichier généré est du même type que les fichiers .o origine.

 $ file ao ao: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not ssortingpped $ file co co: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not ssortingpped 

Si vous voulez créer une archive de deux fichiers .o ou plus (c’est-à-dire une bibliothèque statique), utilisez la commande ar :

 ar rvs mylib.a file1.o file2.o