Làm cách nào để kết hợp hai tệp đối tượng .o đã được GCC biên dịch thành tệp .o thứ ba?
$ 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
Nếu bạn có quyền truy cập vào các tệp nguồn, -combine
cờ GCC sẽ hợp nhất các tệp nguồn trước khi biên dịch:
$ gcc -c -combine a.c b.c -o c.o
Tuy nhiên, điều này chỉ hoạt động đối với các tệp nguồn và GCC không chấp nhận .o
tệp làm đầu vào cho lệnh này.
Thông thường, liên kết .o
các tệp không hoạt động bình thường, vì bạn không thể sử dụng đầu ra của trình liên kết làm đầu vào cho nó. Kết quả là một thư viện được chia sẻ và không được liên kết tĩnh vào tệp thực thi kết quả.
$ 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
-combine
tùy chọn. Nó tồn tại trong gcc 4.1.2 và không tồn tại trong gcc 6.3.0 (người khác có thể tìm ra ngay khi nó bị xóa).