将两个GCC编译的.o目标文件合并为第三个.o文件

一个人如何将两个由GCC编译的.o目标文件合并到第三个.o文件中?


$ gcc -c  a.c -o a.o

$ gcc -c  b.c -o b.o

$ ??? a.o b.o -o c.o

$ gcc c.o other.o -o executable

如果您有权访问源文件,则-combineGCC标志将在编译之前合并源文件:


$ gcc -c -combine a.c b.c -o c.o

但是,这仅适用于源文件,GCC不接受.o文件作为此命令的输入。


通常,链接.o文件无法正常工作,因为您无法使用链接器的输出作为输入。结果是一个共享库,并且没有静态链接到生成的可执行文件中。


$ gcc -shared a.o b.o -o c.o

$ gcc c.o other.o -o executable

$ ./executable

./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory

$ file c.o

c.o: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

$ file a.o

a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped


白衣染霜花
浏览 1252回答 3
3回答

翻阅古今

传递-relocatable或-r以ld将创建一个对象,它是适合作为输入ld。$ ld -relocatable a.o b.o -o c.o$ gcc c.o other.o -o executable$ ./executable生成的文件与原始.o文件的类型相同。$ file a.oa.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped$ file c.oc.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

MYYA

如果要创建两个或更多.o文件的存档(即静态库),请使用以下ar命令:ar rvs mylib.a file1.o file2.o

弑天下

警告: --relocatable似乎不太方便携带。Android NDK随附的ld只能识别-relocatable。如果您需要便携性,请坚持使用-r。
打开App,查看更多内容
随时随地看视频慕课网APP