我正在构建 .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/