我建立.so库,并想知道 - 有什么不同的B / W -h和-o立方厘米编译选项(使用Sun Studio 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)看到的。

然后,当你以后需要增加新的功能,你可以改变-olibfoo.so.1.1但在离开的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

(由旧了Imake生成文件发生器从X内置生成文件通常做到这一点。)

其他提示

它们指的是不同的名称。具体来说,-o选项是该文件的实际的名字 - 在文件系统中的一个。所述-h选项设置内部最终的目标文件中DT_SONAME。这是通过该共享对象被其他模块内部参照的名称。我相信这是你也看到,当你链接到它的物体运行ldd名称。

-o选项将命名输出文件而-h选项将设置在库内的固有名称。通过动态加载器使用时,该固有名称具有在文件名的优先和允许它使用预定义的规则来偷看正确的库。

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

elfdump -d xxx.so |的grep SONAME

看看这里的细节:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top