Comment peut-on combiner deux fichiers objets .o compilés par GCC dans un troisième fichier .o?
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable
Si vous avez accès aux fichiers source, le -combine
L'indicateur GCC fusionnera les fichiers source avant la compilation:
$ gcc -c -combine a.c b.c -o c.o
Cependant, cela ne fonctionne que pour les fichiers source et GCC n'accepte pas .o
fichiers en entrée pour cette commande.
Normalement, la liaison .o
les fichiers ne fonctionnent pas correctement, car vous ne pouvez pas utiliser la sortie de l'éditeur de liens comme entrée pour celui-ci. Le résultat est une bibliothèque partagée et n'est pas lié statiquement à l'exécutable résultant.
$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
Qui passe -relocatable
ou -r
à ld
créera un objet qui convient comme entrée de ld
.
$ ld -relocatable a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
Le fichier généré est du même type que l'original .o
des dossiers.
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
$ file c.o
c.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
Si vous souhaitez créer une archive de deux ou plusieurs fichiers .o (c'est-à-dire une bibliothèque statique), utilisez la commande ar
:
ar rvs mylib.a file1.o file2.o