cc(C++)中-h <name>和-o <outputfile>选项之间的区别

Ste*_*eve 3 c++ unix linux solaris sunstudio

我正在构建.so库并且想知道 - b/w -h和-o cc complier选项(使用Sun Studio C++)有什么区别?

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

ala*_*anc 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
Run Code Online (Sandbox Code Playgroud)

然后,如果您编译您的hello world应用程序并使用它链接

cc -o hello -lfoo
Run Code Online (Sandbox Code Playgroud)

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

然后,当您需要稍后添加新函数时,可以将-o值 更改为libfoo.so.1.1-h at 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
Run Code Online (Sandbox Code Playgroud)

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