是否可以从gcc中的其他目标文件创建目标文件?

时间:2009-06-14 18:21:48

标签: gcc makefile linker

我试图在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 ...

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

所以可以将目标文件链接在一起,以避免在makefile中有一英里长的行并稍微分解构建过程吗?

3 个答案:

答案 0 :(得分:17)

是:要将多个目标文件合并为一个,请使用ld -rld -Ur

来自Linux上的“man ld”:

   -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最终没有必要。

答案 1 :(得分:9)

我的一堆目标文件是一个库。您可以使用ar创建库 效用。以下示例创建一个名为mylib.a的库,其中包含文件foo.o和bar.o

ar rvs mylib.a foo.o bar.o

然后,您可以在编译器命令行中使用它来链接它:

gcc -o myexe main.c mylib.a

答案 2 :(得分:3)

创建库:

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

要链接它:

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