20

我团队项目的开发方式是,我们从所有.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,所以我假设它不可能拥有所有的目标文件。我觉得这是我可能会犯一个小错误的事情。有人有什么建议吗?提前致谢。

4

2 回答 2

7

看起来你是对的,-shared-r不是一起工作。我对您的旧 GCC 版本持怀疑态度,但即使在 Ubuntu 10.10 上我也能看到相同的结果:

$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together

不幸的是,如果您绝对需要共享对象,这意味着您已经走到了死胡同。binutils 链接器根本没有实现它。

如果您可以选择静态库,那么它们只是可以使用该ar实用程序轻松操作的存档。

否则,您将不得不查看不同的链接器或编译器套件。我不能保证你会发现这个功能,不过,它看起来很奇特。

于 2010-11-22T20:22:12.617 回答
5

您可以在使用归档/静态库后获得您的行为,但初始链接仍将花费相同的时间。

使用存档文件:

# Initially create the archive
ar r libmylib.a <all object files>

# Create your shared object (re-use this line after libmylib.a is updated)
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so     

# Update the archive file
ar r libmylib.a updated1.o updated2.o

正如我所说,实际链接它仍然需要与.so以前相同的时间。

于 2012-07-03T15:05:25.840 回答