我正在构建.so库并想知道 - 有什么区别b/w -h和-o cc编译器选项(使用Sun Studio C++) ?-h <name>与-o <outputfile>之间的差异cc(C++)
它们不是指的是同一件事 - 输出文件的名称?
我正在构建.so库并想知道 - 有什么区别b/w -h和-o cc编译器选项(使用Sun Studio C++) ?-h <name>与-o <outputfile>之间的差异cc(C++)
它们不是指的是同一件事 - 输出文件的名称?
-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通常会这样做。)
感谢队友,很好的解释。 – Steve 2009-12-10 01:34:21
它们指的是不同的名称。具体来说,-o
选项是文件的实际名称 - 文件系统上的名称。 -h
选项在最终的目标文件中设置内部DT_SONAME
。这是共享对象由其他模块内部引用的名称。我相信这是您在链接到它的对象上运行ldd
时也会看到的名称。
-o选项将命名输出文件,而-h选项将在库内设置内部名称。此内在名称优先于动态加载器使用的文件名,并允许它使用预定义的规则来查看正确的库。
你可以看到内在的名字被记录到与该命令指定库:
elfdump -d XXX。所以| grep的SONAME
看看这里的细节:
http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter4-97194.html
问得好 - 文档说,“一般来说,-h后面的名称应该是完全一样的-o后的一个”。如果他们说你什么时候可能想让他们变得不同,或者如果你指定一个而不是另一个,会发生什么。我认为有一点实验是为了。 – 2009-12-10 00:11:16