połącz dwa GCC skompilowane.o pliki obiektowe w trzeciej.o plik
Jak połączyć dwa GCC skompilowane .o pliki obiektowe w trzeciej .plik 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
Jeśli masz dostęp do plików źródłowych, znacznik -combine
GCC połączy pliki źródłowe przed kompilacją:
$ gcc -c -combine a.c b.c -o c.o
Jednak działa to tylko dla plików źródłowych, a GCC nie akceptuje plików .o
jako danych wejściowych dla tego polecenia.
Zwykle łączenie plików .o
nie działa poprawnie, ponieważ nie można użyć wyjścia linkera jako wejścia dla niego. Rezultatem jest biblioteka współdzielona i nie jest połączony statycznie z wynikowym programem wykonywalnym.
$ 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
2 answers
Przejście -r
(lub --relocatable
) do ld
spowoduje utworzenie obiektu, który będzie odpowiedni jako wejście ld
.
$ ld -r a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
Wygenerowany plik jest tego samego typu co oryginalne pliki .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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-05 11:26:50
Jeśli chcesz utworzyć archiwum z dwóch lub więcej .o files (tj.. biblioteka statyczna) użyj polecenia ar
:
ar rvs mylib.a file1.o file2.o