2013-07-30 95 views
3

我正在開發C++類的集合,並且正在努力如何以維護組織的方式共享代碼,而不會影響集合用戶編譯的簡易性。我所看到的如何構建C++源代碼的「庫」?

選項包括:

  • 分發編譯庫文件
  • 放入頭文件的源(與隱內嵌在這個answer討論)
  • 使用符號鏈接允許編譯器來查找這些文件。

我目前使用,其中,每個類的我想包括我的符號鏈接每類新報頭和源文件(例如,ln -s <path_to_class folder>/myclass.cpp)這種運作良好,只是我不能移動項目文件夾的第三個選項位置(它打破了所有的符號鏈接),我必須將所有這些符號鏈接的文件掛起來。

我喜歡第二個選項(它具有Java的外觀),但是我擔心如果一切聲明爲內聯,代碼大小膨脹。

該集合的用戶將在某處創建項目文件夾,並以某種方式將該集合包含到其編譯過程中。

我想幾件事情成爲可能:

  1. 容易編譯(類似gcc *.cpp從項目文件夾)
  2. 在未編譯表單庫方便地分發。
  3. 按模塊組織圖書館。
  4. 編譯的代碼大小沒有臃腫。

我並不擔心文檔(Doxygen負責)或編譯時間:整體模塊很小,甚至最慢的機器上的最大項目也不會超過幾秒的時間來編譯。

我使用的GCC編譯器,如果它有任何區別。

+0

庫文件基本上是標準的。如果您對建立圖書館有所保留,請考慮scons。它比make更容易使用,並且不會將代碼綁定到configure/make路徑。它也使得Windows的端口更容易。 – Jiminion

回答

0

我結束了對所有代碼使用內聯標頭。你可以在這裏看到的圖書館:

https://github.com/libpropeller/libpropeller/tree/master/libpropeller

庫的結構爲:

  • 庫文件夾
    • A級
      • classA.h
      • classA.test。 h
    • B類
      • classB.h
      • classB.test.h
    • C類
    • ...

利用這種結構我可以分發庫作爲源代碼,並且所有用戶必須做的事情是在其生成文件中包含-I/path/to/library,並且#include "library/classA/classA.h"在他們的源文件中。

而事實證明,內聯頭實際上是減少了的代碼大小。我做了一個full analysis of this,事實證明,頭文件中的內聯代碼允許編譯器使最終的二進制文件大小縮小5%。

0

圖書館是你提出的三個最好的選擇(在我看來)。然後在鏈接器路徑中提供包含路徑中的頭文件和庫。由於你也想以源代碼的形式發佈這個庫,我傾向於在中央倉庫中提供壓縮歸檔(gzip,7-zip,tarball或其他首選格式)。

0

如果我理解正確,您不希望用戶必須將.cpp文件包含在其構建中,而只是希望他們使用以下兩種方法之一:(i)直接使用頭文件,(ii)使用編譯後的lib。

您的要求有點不尋常,但可以實現。在我看來,您可以按照以下方式組織您的代碼。首先,有一個全球性的定義決定了你是否正在編譯庫:

// global.h 
// ... 
#define LIB_SOURCE 
// ... 

然後在每一個頭文件,你檢查是否定義設置:如果庫分佈爲靜態/共享庫,不包括定義,否則,'.cpp'文件包含在頭文件中。

// A.h 
#ifndef _A_H 
#include "global.h" 
    #ifdef LIB_SOURCE 
    #include "A.cpp" 
#endif 
// ... 
#endif 

其中'A.cpp'包含實際的實現。

同樣,這是一個非常奇怪的做事方式,我實際上會建議不要這樣做。更好的方法(但需要更多工作的方法)是始終分發共享庫。但爲了讓事情獨立於編譯器,圍繞它編寫一個C層。這樣,你有一個便攜式,可維護的圖書館。

至於其他的一些要求:

  • 保持製作過程簡單,提供一個Makefile
  • 如果您擔心編譯庫的代碼大小,看看gcc的優化選項(-Os )。如果您在頭文件中以源代碼形式分發時擔心庫的代碼大小,這會更棘手。由於(內聯)代碼實際上位於標題中,所以代碼顯然會隨着每個包含在用戶的.cpp文件中而增加。