我团队项目的开发方式是,我们从所有.o
对象文件中为我们的应用程序生成一个共享对象库。我的任务(希望它足够具体,但也足够通用以对其他人有用!)是仅链接自上次创建可执行文件以来已更改的目标文件。例如,这是我用来构建 .so 的命令行:
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o libMySharedLibrary.so
哪个按预期工作!:) 我的目标是从现在开始只能链接更改的目标文件,以加快并发链接过程。一个示例命令是:
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o libMySharedLibrary.so
这将libMySharedLibrary.so
使用较新的目标文件进行更新,同时还保留较旧的目标文件libMySharedLibrary.so
。实际上,当我libMySharedLibrary.so
使用上面的命令生成时,文件大小比包含所有目标文件时的文件大小要小得多,所以我几乎可以肯定上面的命令没有做我想要的。
通过我的研究,我发现-i
链接器有一个选项与-r
选项相同,它似乎也只是将所有目标文件组合成一个大目标文件。不幸的是,这似乎不是我想要的。
简而言之,我只想在初始链接之后链接更改的目标文件,从而为将来的链接提供更快的链接过程。有没有办法做到这一点?
编辑:我尝试过的一个例子-i/-r
:
示例命令:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o
我必须添加-nostdlib
标签以阻止它对我大喊大叫需要它,并删除,-shared
因为标签不允许共享对象-r
。
这个命令似乎将我所有的 .o 文件都塞进一个大的 .o 文件中。因此,如果我可以从现在开始仅使用已更改的 .o 文件更新该 .o 文件,那就太好了。在最初创建 AllMyObjects.o 之后,我尝试了这个命令:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o
,但它也会创建一个更小的 (file-size-wise) AllMyObjects.o
,所以我假设它不可能拥有所有的目标文件。我觉得这是我可能会犯一个小错误的事情。有人有什么建议吗?提前致谢。