2009-12-09 92 views
3

我正在構建.so庫並想知道 - 有什麼區別b/w -h和-o cc編譯器選項(使用Sun Studio C++) ?-h <name>與-o <outputfile>之間的差異cc(C++)

它們不是指的是同一件事 - 輸出文件的名稱?

+0

問得好 - 文檔說,「一般來說,-h後面的名稱應該是完全一樣的-o後的一個」。如果他們說你什麼時候可能想讓他們變得不同,或者如果你指定一個而不是另一個,會發生什麼。我認爲有一點實驗是爲了。 – 2009-12-10 00:11:16

回答

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 

然後,如果你編譯你的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通常會這樣做。)

+0

感謝隊友,很好的解釋。 – Steve 2009-12-10 01:34:21

2

它們指的是不同的名稱。具體來說,-o選項是文件的實際名稱 - 文件系統上的名稱。 -h選項在最終的目標文件中設置內部DT_SONAME。這是共享對象由其他模塊內部引用的名稱。我相信這是您在鏈接到它的對象上運行ldd時也會看到的名稱。

1

-o選項將命名輸出文件,而-h選項將在庫內設置內部名稱。此內在名稱優先於動態加載器使用的文件名,並允許它使用預定義的規則來查看正確的庫。

你可以看到內在的名字被記錄到與該命令指定庫:

elfdump -d XXX。所以| grep的SONAME

看看這裏的細節:

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

相關問題