2009-12-09 90 views
3

我正在构建.so库并想知道 - 有什么区别b/w -h和-o cc编译器选项(使用Sun Studio C++) ?-h <name>与-o <outputfile>之间的差异cc(C++)

它们不是指的是同一件事 - 输出文件的名称?

+0

问得好 - 文档说,“一般来说,-h后面的名称应该是完全一样的-o后的一个”。如果他们说你什么时候可能想让他们变得不同,或者如果你指定一个而不是另一个,会发生什么。我认为有一点实验是为了。 – 2009-12-10 00:11:16

回答

5

-o是将由编译

-h被写入到磁盘上的文件的名称是将被记录在针对该文件链接的ELF可执行文件的名称。

一个常见的用途是提供库次要版本号。举例来说,如果 要创建的共享库libfoo时,你可能会做:

cc -o libfoo.so.1.0 -h libfoo.so.1 *.o 
ln -s libfoo.so.1.0 libfoo.so.1 
ln -s libfoo.so libfoo.so.1 

然后,如果你编译你的Hello World的应用程序,并连接它与

cc -o hello -lfoo 

的精灵二进制打招呼将记录NEEDED条目libfoo.so.1(您可以通过运行elfdump -d hello查看 )。

然后,当你以后需要增加新的功能,你可以在-o值更改为 但libfoo.so.1离开-h - 你已经建立 与1.0的所有程序仍试图在运行时加载libfoo.so.1,所以继续没有 重建工作,但你会通过ls看到它是1.1。

如果您没有单独的安装目录或通过打包系统安装 ,那么有时也会在运行时使用在同一目录中构建库的方式使用它们,即 。为了避免崩溃,正在运行的程序,当你 覆盖二进制库,并避免不被程序能够启动时 你在大楼的中间的时候,有些makefile做:

cc -o libfoo.so.1.new -h libfoo.so.1 *.o 
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1 

(Makefile中建来自X的旧Imake makefile generator通常会这样做。)

+0

感谢队友,很好的解释。 – Steve 2009-12-10 01:34:21

2

它们指的是不同的名称。具体来说,-o选项是文件的实际名称 - 文件系统上的名称。 -h选项在最终的目标文件中设置内部DT_SONAME。这是共享对象由其他模块内部引用的名称。我相信这是您在链接到它的对象上运行ldd时也会看到的名称。

1

-o选项将命名输出文件,而-h选项将在库内设置内部名称。此内在名称优先于动态加载器使用的文件名,并允许它使用预定义的规则来查看正确的库。

你可以看到内在的名字被记录到与该命令指定库:

elfdump -d XXX。所以| grep的SONAME

看看这里的细节:

http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter4-97194.html

相关问题