възможно ли е да се създаде обектен файл от други обектни файлове в gcc?

Опитвах се да направя нещо подобно в makefile:

program.exe: ui.o main.o
   gcc ......etc
ui.o: window1.o window2.o
   gcc -c window1.o window2.o -o ui.o #this doesn't want to work
window1.o: window1.c window1.h window1_events.c window1_controls.c ...
   gcc -c window1.c window1_events.c window1_controls.c... -o window1.o
window2.o: ...
   gcc ...
main.o: ...
   gcc ...

но когато компилирам по този начин, дава грешка "входен файл неизползван, защото свързването не е извършено" и след това получавам куп неразрешени външни и т.н. - проблеми, които се решават чрез промяна

program.exe: ui.o main.o
   gcc ...

to

program.exe: window1.o window2.o main.o
   gcc ...

така че възможно ли е просто да свържете обектни файлове заедно, за да избегнете дълги мили редове в makefile и да разбиете процеса на изграждане малко повече?


person Carson Myers    schedule 14.06.2009    source източник
comment
Възможен дубликат на комбинирайте два GCC компилирани . o обектни файлове в трети .o файл   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 06.10.2015
comment
@CiroSantilli六四事件法轮功纳米比亚威视 този въпрос беше зададен една година преди свързания. Освен това е на повече от шест години.   -  person Carson Myers    schedule 06.10.2015
comment
Консенсусът е, че гласовете за са по-важни от възрастта. Въпросите са полезни завинаги, така че това, че са стари, не означава, че не трябва да бъдат затворени. Мир s2   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 06.10.2015


Отговори (3)


Аз куп обектни файлове е библиотека. Можете да създадете библиотека с помощната програма ar. Следващият пример създава библиотека, наречена mylib.a, съдържаща файловете foo.o и bar.o

ar rvs mylib.a foo.o bar.o

След това можете да се свържете с него, като го използвате в командния ред на компилатора:

gcc -o myexe main.c mylib.a
person Community    schedule 14.06.2009

Да: за да обедините няколко обектни файла в един, използвайте ld -r или ld -Ur:

От "man ld" на Linux:

   -r
   --relocatable
      Generate  relocatable  output---i.e.,  generate  an output file that can
      in turn serve as input to ld.  This is often called partial linking.
      As a side effect, in environments that support standard Unix magic
      numbers, this option also sets the output file’s magic number to
      "OMAGIC".
      If this option is not specified, an absolute file is produced.
      When linking C++ programs, this option will not resolve references to
      constructors;  to do that, use -Ur.

Можете също да направите това с gcc:

gcc -Wl,-r foo.o bar.o -o foobar.o -nostdlib

Обединяването на обектни файлове като това има някои предимства пред използването на архивна библиотека: ако обединените файлове се променят много рядко (в сравнение да речем с main.c), вашите крайни изпълними връзки ще бъдат по-бързи.

OTOH, с архивирана библиотека, линкерът ще използва само това, от което се нуждае, така че вашият изпълним файл може да се окаже по-малък, ако напр. window2.c в крайна сметка не е необходим.

person Employed Russian    schedule 14.06.2009

За да създадете библиотека:

ar rvs somelib.a file1.o file2.o file3.o

За да го свържете:

gcc -o program.exe file4.o somelib.a
person PaV    schedule 14.06.2009