2009-09-09 172 views
60

我正在使用C++库。最终,我想将其公开提供给多个平台(至少Linux和Windows),以及一些示例和Python绑定。工作进展顺利,但目前该项目相当混乱,完全依靠Visual C++而建立,而不是多平台。C++库的目录结构

因此,我觉得一个清理是为了。我想要改进的第一件事是项目的目录结构。我想创建一个适合Automake工具的结构,以便在多个平台上轻松编译,但我以前从未使用过这些结构。由于我仍将在Visual Studio中完成(大部分)编码,因此我需要在某处保留我的Visual Studio项目和解决方案文件。

我试图谷歌的术语像“C++库目录结构”,但似乎没有用。我发现了一些非常基本的指导方针,但没有明确的解决方案

虽然看一些开源库,我想出了以下内容:

\mylib 
    \mylib <source files, read somewhere to avoid 'src' directory> 
     \include? or just mix .cpp and .h 
    \bin <compiled examples, where to put the sources?> 
    \python <Python bindings stuff> 
    \lib <compiled library> 
    \projects <VC++ project files, .sln goes in project root?> 
    \include? 
    README 
    AUTHORS 
    ... 

我有一个多平台开发/开源项目无/小以往的经验和我相当惊讶,我找不到关于如何构建这样一个项目的任何好的指导方针。

一般人应该如何构建这样的图书馆项目?建议阅读什么?有一些很好的例子吗?

+0

好像http://stackoverflow.com/questions/1383174/source-file-organisation/1383188#1383188 – 2009-09-09 10:18:44

回答

80

有一件事情是很常见的Unix图书馆之间是他们组织这样的:

./   Makefile and configure scripts. 
./src  General sources 
./include Header files that expose the public interface and are to be installed 
./lib  Library build directory 
./bin  Tools build directory 
./tools Tools sources 
./test  Test suites that should be run during a `make test` 

它有点反映/usr下,传统的Unix文件系统,其中:

/usr/src  Sometimes contains sources for installed programs 
/usr/include Default include directory 
/usr/lib  Standard library install path 
/usr/share/projectname Contains files specific to the project. 

当然,这些可能以/usr/local(这是GNU autoconf的默认安装前缀)结束,它们可能根本不遵守这个结构。

没有硬性规定。我个人不会这样组织事情。 (除了最大的项目,我完全避免使用./src/目录,例如,我也不使用自动工具,宁愿使用CMake。)

我对你的建议是,你应该选择一个目录布局,使感觉你(和你的团队)。根据您选择的开发环境,构建工具和源代码控制进行最明智的操作。

+3

的重复使用CMake的,OUT-源代码构建看起来很棒。 – Korchkidu 2012-03-09 10:14:46

5

我不认为实际上有任何好的指导方针。大部分只是个人喜好。不过,某些IDE将为您确定一个基本结构。例如,Visual Studio将创建一个单独的bin文件夹,该文件夹分为Debug和Release子文件夹。在VS中,当你使用不同的目标编译代码时,这是有意义的。 (调试模式,发布模式)

正如greyfade所说,使用对您有意义的布局。如果有人不喜欢它,他们将不得不自己重组它。幸运的是,大多数用户会对你选择的结构感到满意。 (除非是真正的混乱。)

4

我觉得wxWidgets库(开源)是一个很好的例子。它们支持许多不同的平台(Win32,Mac OS X,Linux,FreeBSD,Solaris,WinCE ...)和编译器(MSVC,GCC,CodeWarrior,Watcom等)。你可以看到树布局在这里:

https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk/