2009-02-21 76 views
1

动态库很不错。然后嵌入信息,帮助运行时链接程序确定最终可执行文件需要加载的其他库。它还会告诉可执行文件什么样的符号将被加载动态链接器依赖信息嵌入在档案中

然而,静态库是一个痛苦的脖子。链接器不会自动链接存档的依赖关系。当静态链接一个中等复杂或具有深度依赖关系图的库时,这会变得非常令人讨厌。

那么为什么不能存档只包括他们的依赖信息。我试图做到这一点。我的想法的关键是/usr/lib/libc.so。该文件不是共享对象文件,而是链接器脚本。

链接脚本给你很多在最后连接输出控制的,但我要的是指定的依赖,你可以用:

INPUT(-ldependency -ldependecy2) 

这里是我的问题。

  • 这看起来很简单,为什么以前没做过?我不能成为第一个想到这一点的人。这似乎比pkg-config或libtool更简单也更直观(尤其是libtool呃)。
  • 我试图将链接器脚本嵌入到存档中,它不起作用。为什么不?它可以工作吗?我怀疑一些聪明的使用ranlib可能会诀窍,但它超出了我的想象。

我目前的解决方案是创建一个名为libMyLibrary.a的链接器脚本。它包含

INPUT(-lMyRealLibrary -ldependency1 -ldependency2) 

我必须把手工的依赖关系,它会如果LD可以为我是很好的,但在另一天是问题。

+0

为什么不使用libtool?它已经为静态库保留了依赖关系。任何特定的并发症 – Hasturkun 2009-02-22 12:07:21

+0

path/to/build/dir/libtool --mode =执行gdb path/to/executable。我认为libtool是一个有效和可怕的解决方案。 – 2009-02-24 21:48:59

回答

0

要回答您的问题的第二部分,ar p ARCHIVE SCRIPT将捕获包含在ARCHIVE中的SCRIPT的内容。或者ar x ARCHIVE SCRIPT来提取文件,然后将其传递给像ld blah blah -TSCRIPT这样的链接器。

0

此表单的链接脚本仅由GNU-ld支持(新的Gold ELF链接器也具有有限的支持)。如果您有任何可移植性要求,则最好不要依赖链接器脚本支持。

libtool写入特别是帮助创建共享库的可移植性(详细信息在不同平台之间差异很大)。

如果你不需要可移植性,那么当然你不需要libtool及其复杂性。