2014-02-19 133 views
-1

我一直在爲此掙扎了很長一段時間,現在我真的需要弄清楚這一點。問題很簡單。我有一個庫L,依賴於另一個庫D,然後我想爲我的項目使用庫L。問題是,當我包括L的頭我得到(自然?)錯誤「無法打開包含文件是D的一部分」。庫依賴關係C++項目

如果我正在寫一個需要使用的項目L我不想關心它的依賴關係。一個實際的例子是一個包裝多個圖形API的「渲染框架」。用戶不想爲正確的操作系統包含正確的標題,因爲這是圖書館的義務!

我真的很希望我明確自己,如果這個問題已經得到解答(我敢打賭它),請給我一些關鍵字來搜索?

感謝您對您的時間&編碼快樂:)

+1

對不起!你不能每個人都想'關心它的依賴關係'。要解決包含路徑依賴關係,例如GCC的'-I'選項可以解決庫路徑依賴問題,鏈接器有'-L'選項。 –

+0

如果L的標題需要D的標題,那麼你需要D的標題來使用L. Period。故事結局。你能修改L庫嗎?如果是這樣,有可能使L的標題不依賴於Ds標題... –

+0

@πάνταῥεῖ如果他可以和我們所有人都錯了怎麼辦? :-D – 2014-02-20 04:08:55

回答

0

鏈接L靜態到你的「渲染架構」我建議你從IMB幫助閱讀:When to use dynamic linking and static linking

當你建立L作爲靜態庫,你可以「在你的可執行文件中包含「it」。所以,你不必關心L的位置。這有一些缺點,例如:如果你想改變屬於L的兒子一段代碼,你將不得不重新編譯你所有的「渲染框架」。

表示:

實施頂庫L。使用一些靜態庫(例如D)。並將中的所有*.h文件包含在您希望用戶使用的文件中。

Boost庫使用此模式進行代碼組織。

+0

也許我沒有得到它:(問題的關鍵是:如果我有一個示例應用程序,使用渲染框架,我不'我想要手動包含Direct3D或OpenGl,我希望框架能夠做到這一點,並且框架將通過#pragma註釋來關聯庫。這是一種糟糕的方法嗎? –

+1

嗯,我不喜歡指向SO以外的來源的鏈接,除非這些指向某些「官方」標準出版物。即使如此,我寧願在這裏引用他們。 –

+0

好吧,我得到你想說的,但是如果我在「L」中包含一個頭「D」,然後在我的示例應用程序中包含「L」,我會收到錯誤(自然?)「丟失」D「 」。有什麼辦法可以避免這種情況?我確實包含了來自「L」的頭文件 –

0

[I]網絡有一個使用的渲染架構我不想一個示例應用程序手動包括的Direct3D或OpenGL [...]

如果你的渲染架構已正確安裝,其像OpenGL這樣的依賴關係也必須正確安裝。在這種情況下,框架的頭文件應該在他們所期望的位置找到依賴項的頭文件。