2009-09-05 101 views
9

我在組織源文件時遇到了一些麻煩。源文件組織

我有我自己的小,但越來越多的代碼,我想在各種項目中使用的集合。文件和文件夾的佈局是這樣的:

庫\ SUB1 \ source.h

庫\ SUB1 \ source.cpp

庫\ SUB2 \ source.h

庫\ SUB2 \ source.cpp

之一我的問題是,我想根據需要在我的其他項目中包含此代碼。迄今爲止,我使用絕對路徑指向庫文件的代碼,但是必須有更好的方法。

此外,我需要將每個庫文件添加到項目的文件Visual Studio中,以便它能夠正確編譯。

所以我的問題總之是如何解決這個問題?處理上述情況的最佳方式是什麼?

+1

爲什麼你想在其他項目中包含源代碼?以這種臨時方式使用幾個項目中使用的源文件是瘋狂的 - 你一定會對一個打破另一個項目的項目進行更改。它還消除了使用庫的好處之一 - 你只需要lib和include文件 - 而不是源文件。 嘗試更加嚴謹 - 這將節省時間,長期而且可能在短期內。使用版本庫和版本控制系統(git,subversion或其他)。確保你正確的「版本」,併發布你的庫的測試/交付版本。 – Dipstick 2009-09-05 12:59:01

+1

也許這應該是一個社區wiki問題?沒有一個答案,但這更多的是關於源文件組織的討論。 – 2009-09-05 14:11:34

回答

3

我不認爲有一個正確的方式來做到這一點 - 這將取決於你正在努力實現的。

這裏有一些事情你可能不知道的:

  • 您可以在項目中使用相對路徑。

  • 您可以在路徑中使用環境變量。

  • 您可以將目錄添加到Visual Studio的搜索規則中。

這給了你,你把包含文件,如果你把你的文件夾到Visual Studio的搜索規則,你不必包括所有的任何路徑上多一點控制。

1

首先:將所有使用的導向器添加到您的項目包含路徑。如果可能,將它們添加爲相對路徑。

第二:你必須添加所有使用的圖書館/源文件到你的項目。這可以在項目瀏覽器中完成,也可以在Project-> Linker選項卡中完成。在後一種情況下,您也必須將使用的目錄添加到項目庫路徑中。

在#include指令中使用路徑通常不是一個好主意。

3

一般而言,您不應將來自庫的源文件直接添加到其他項目。將它們分別編譯爲一個庫並使用它們。

組織庫的目錄結構本身,現在我看中了類似如下結構

  • LIBRARY1/widget.h
  • LIBRARY1 /私營/ onlyinlib.h
  • LIBRARY1 /私營/ widget.cpp

(和如果適用的話)

  • LIBRARY1 /私營/資源/ widget.jpg
  • LIBRARY1 /私營/項目/ widget.xcode

我把所有頭直接在庫路徑,並有一個子文件夾private其中將包含一切都只是圖書館使用,但不應共享/暴露。

最大的好處是,每一個項目,我開始只需要一個包含路徑的目錄包含我的圖書館指指點點,然後每隔(公衆)包括:就像做

#include "library1/widget.h" 

私人包括僅僅

#include "onlyinlib.h" 

這有許多優點:

  • 如果新庫介紹,沒有搞亂項目/編譯器設置來使頭部可見。
  • 轉移到其他編譯器/平臺也很麻煩。
  • 標題是自動「命名空間」,由包括路徑太的一部分,即,它是幾乎不可能得到nameclash與包括
  • 它立刻明顯,其中一個標題從何而來,如果頭是一部分公共接口或不
2

如果您必須包含第三方代碼,而不是隻是一個預編譯的版本連接(例如,也許你需要修改或調整,以它),考慮分支它無論你用於源代碼管理:

  • /主幹/ ... --- 你的代碼放在這裏
  • /第三方---第三方庫的原始拷貝到這裏
    • /第三方/ LIB1
    • /第三方/ lib2
  • /主幹/ LIB1 --- 地支: /第三方/ LIB1,或許與當地的變化
    • 這是你建立與/鏈接的版本。

假設你使用一個體面的源代碼控制系統,該方案將讓你輕鬆升級到第三方庫的更新,然後合併與您在本地所做的更改這些更改。

例如,假設 「LIB1」 發佈一個新的版本:

  • 提交更改到/第三方/ lib1內。
  • 合併 /第三方/ LIB1 /主幹/ LIB1
  • 解決任何合併衝突。

這是國際海事組織唯一可以處理升級本地修改的第三方庫的理智方式。