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

Я пытался сделать что-то подобное в make-файле:

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 ...

так можно ли просто связать объектные файлы вместе, чтобы избежать длинных строк в make-файле и еще больше нарушить процесс сборки?


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