我团队项目的开发方式是,我们从所有 .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
选项相同,它似乎只是结合了所有目标文件也合并到一个大目标文件中。不幸的是,这似乎不是我想要的。
简而言之,我想在初始链接后仅链接更改的目标文件,从而使 future 链接的链接过程更快。有没有办法做到这一点?
编辑:我用 -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
,但它也会创建一个更小的(文件大小)AllMyObjects.o
,所以我假设它不可能拥有所有目标文件。我觉得这是我可能犯的一个小错误。有人有什么建议吗?提前致谢。
最佳答案
看起来你对 -shared
和 -r
不能一起工作的看法是对的。我对您的旧 GCC 版本持怀疑态度,但即使在 Ubuntu 10.10 上我也能看到同样的情况:
$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together
不幸的是,如果您绝对需要共享对象,这意味着您已经走到了死胡同。 binutils 链接器根本没有实现它。
如果您可以选择静态库,它们只是简单的存档,可以使用 ar
实用程序轻松操作。
否则,您将不得不查看不同的链接器或编译器套件。不过,我不能保证您会找到此功能,它看起来很奇特。
关于linux - 在 Linux 上使用 gcc 进行增量链接。可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4249401/