Как каждый объединяется, два GCC скомпилировали.o объектные файлы в треть.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
Если у Вас есть доступ к исходным файлам -combine
Флаг GCC объединит исходные файлы перед компиляцией:
$ gcc -c -combine a.c b.c -o c.o
Однако это только работает на исходные файлы, и GCC не принимает .o
файлы, как введено для этой команды.
Обычно, соединение .o
файлы не работают правильно, поскольку Вы не можете использовать вывод компоновщика, как введено для него. Результат является общей библиотекой и не связан статически в получающийся исполняемый файл.
$ 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
Передача -relocatable
или -r
в ld
создаст объект, который подходит для входа ld
.
$ ld -relocatable a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
Созданный файл имеет тот же тип, что и исходные файлы .o
.
$ 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
Если вы хотите создать архив из двух или более файлов .o (т. Е. Статическую библиотеку), используйте команду ar
:
ar rvs mylib.a file1.o file2.o