Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

is it possible to create an object file from other object files in gcc?

I was trying to do something like this in a 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 ...

but when I compile like this, it gives the error "input file unused because linking not done," and then I get a bunch of unresolved externs, etc--problems which are resolved by changing

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

to

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

so is it possible to just link object files together, to avoid having mile-long lines in a makefile and break down the build process a little more?

like image 204
Carson Myers Avatar asked Nov 27 '22 10:11

Carson Myers


1 Answers

Yes: to merge several object files into one, use ld -r or ld -Ur:

From "man ld" on 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.

You could also do this with gcc:

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

Merging object files like this has some advantages over using an archive library: if merged files change very infrequently (compared to say main.c), your final executable links will be faster.

OTOH, with archived library, the linker will only use what it needs, so your executable may end up being smaller if e.g. window2.c ends up not being necessary.

like image 157
Employed Russian Avatar answered Dec 09 '22 11:12

Employed Russian