2012-06-24 43 views
2

我將詳細列出一個常見的假設問題。如何處理未提供庫的頭文件

問題:

我提供的靜態庫說libX.a和頭文件a.hb.h。頭文件a.hb.h包含庫導出的API。 a.h包括a1.hb.h包括b1.h。但a1.hb1.h不由庫的所有者裝運,因爲a1.hb1.h包含由庫私有使用的數據結構,並且所有者不想公開這些數據結構。

我必須編寫一個調用庫導出的API的應用程序。所以我必須包含a.hb.h,其中包含API的聲明。

好的,很好。我寫我的應用程序,幷包括頭文件a.hb.h並調用API。但是我會得到一個編譯器錯誤,因爲編譯器找不到內部包含a.hb.ha1.hb1.h

問題:

  1. 是否有一個解決這個問題?如果是的話,認真尋求解決方案:)

  2. 圖書館所有者是否有必要公開所有私人頭文件他內部使用在他的庫?

回答

2

我將從最後一個開始。圖書館的所有者可以隱藏包含私人信息的標題,但他必須確保公共標題不依賴於那些私人信息,也就是說它們不能包含它們!

至於第一個問題,您可以嘗試刪除這些包含行。它應該編譯,但如果不是這樣,創建者可能會隱藏私有頭文件中的重要內容,這對於除他自己之外的人使用他的庫很重要。

0

1)您可以查看nm工具,請參見SO: how to list symbols in a so-file。也許它也適用於靜態庫,我不確定。

2)圖書館所有者本可以使用Large scale C++ software design by John Lakos中的技術來防止暴露內部結構。也許你可以使用那裏的技術來創建a1.hb1.h所需的部分,而不依賴於你沒有的信息。尤其是聲明結構/類而不定義其內容。

+0

'nm'確實對靜態庫有效。 – unkulunkulu