我正在构建 .so 库并且想知道 - b/w -h 和 -o cc 编译器选项(使用 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

hello 的 elf 二进制文件将为 NEEDED 记录一个 libfoo.so.1 条目(您可以
通过运行 elfdump -d hello 来查看)。

然后当您稍后需要添加新功能时,您可以将 -o 值更改为libfoo.so.1.1 但将 -h 保留在 libfoo.so.1 - 您已经构建的所有程序
使用 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

(由 X 的旧 Imake makefile 生成器构建的 Makefile 通常会这样做。)

关于c++ - cc (C++) 中 -h <name> 和 -o <outputfile> 选项之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1877816/

10-10 22:17