Можно ли создать объектный файл из других объектных файлов в GCC? - PullRequest
3 голосов
/ 14 июня 2009

Я пытался сделать что-то подобное в 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 ...

до

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

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

Ответы [ 3 ]

17 голосов
/ 15 июня 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 не требуется.

9 голосов
/ 14 июня 2009

Я куча объектных файлов - это библиотека. Вы можете создать библиотеку с помощью ar полезность. В следующем примере создается библиотека mylib.a, содержащая файлы foo.o и bar.o

ar rvs mylib.a foo.o bar.o

Затем вы можете связать его, используя его в командной строке компилятора:

gcc -o myexe main.c mylib.a
3 голосов
/ 14 июня 2009

Чтобы создать библиотеку:

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

Чтобы связать это:

gcc -o program.exe file4.o somelib.a
...