gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:54:45 25 4
gpt4 key购买 nike

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

但是当我这样编译时,它会给出错误“输入文件未使用,因为链接未完成”,然后我得到一堆 Unresolved external 等问题,这些问题通过更改解决
program.exe: ui.o main.o
gcc ...


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

那么是否可以只将目标文件链接在一起,以避免在 makefile 中出现一英里长的行并进一步分解构建过程?

最佳答案

是:要将多个目标文件合并为一个,请使用 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 最终没有必要。

关于gcc - 是否可以从gcc中的其他目标文件创建目标文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/993406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com