用于C ++库目录结构(Directory structure for a C++ library)

2019-07-17 11:30发布

我工作的一个C ++库。 最后,我愿让公众可用于多种平台(Linux和Windows至少),有一些例子,沿Python的绑定。 工作是很好的进展,但目前该项目是相当混乱,仅建在和VISUAL 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
    ...

我有一个多平台开发/开源项目无/小以往的经验和我相当惊讶,我无法找到如何构建这样的项目有什么好的指引。

一个应该如何一般结构,库项目? 什么CA推荐阅读? 是否有一些很好的例子?

Answer 1:

有一件事情是很常见的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`

这一定程度上反映了在传统的Unix文件系统/usr其中:

/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的。)

我给你的建议是,你应该选择有意义的你 (和你的团队)的目录结构。 做什么是最明智的您所选择的开发环境,构建工具和源代码控制。



Answer 2:

我不认为实际上有这方面的任何指引好。 大部分是只是个人喜好。 某些IDE的将决定你的基本结构,但。 Visual Studio中,例如,将打造其在调试分成独立的bin文件夹和子文件夹释放。 在VS,这使得当你使用不同的目标编译代码的意义。 (调试模式,释放模式)。

作为greyfade说,使用的布局,对你有意义。 如果别人不喜欢的话,他们将不得不重新调整它自己。 幸运的是,大多数用户会很乐意与您所选择的结构。 (除非它是真实的凌乱。)



Answer 3:

我发现的wxWidgets库(开源)是一个很好的例子。 它们支持多种不同的平台(Win32中,的Mac OS X操作系统,Linux,FreeBSD的,Solaris和WinCE的...)和编译器(MSVC,GCC,CodeWarrior的,WATCOM等)。 你可以看到这里的树布局:

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



Answer 4:

还有,我最近碰到可能会有所帮助这真棒约定: 干草叉布局 (也GitHub上 )。

综上所述,第1.3条规定:

PFL规定,应该出现在项目树的根部几个目录。 并非所有的目录都是必需的,但他们有一个指定的目的,并在文件系统中没有其他目录可以假设这些目录中的一个角色。 也就是说,这些目录必须是在需要它们的目的所使用的那些。

其他目录中不应该出现在根目录下。

build/ :不应该被认为是该项目的源的一部分的特殊目录。 用于存储短暂的构建结果。 不得签入源代码控制。 如果使用源代码控制,必须使用源控制的忽略列表被忽略。

src/ :主编译源位置。 必须存在与不使用子模块编译组件项目。 在存在include/ ,也包含私有头。

include/ :目录公共标题。 可能存在。 对于不私有/公共标题之间区分项目可以省略。 对于使用子模块项目可以省略。

tests/ :用于测试目录。

examples/ :对样品和实施例的目录。

external/由项目使用目录的包/项目,但是不能编辑作为项目的一部分。

extras/ :包含项目额外/可选的子模块的目录。

data/ :包含项目的非源代码方面指南。 这可能包括图形和标记文件。

tools/ :包含目录开发工具,如建立和重构脚本

docs/ :项目文件目录。

libs/ :主工程子模块的目录。

另外,我觉得extras/目录是你的Python绑定应该去 。



Answer 5:

我可以用你的CMake真的建议......它是跨平台的开发,它是更灵活automake认为,使用CMake和你将能够编写跨平台的代码在所有系统上自己的猪病结构。



文章来源: Directory structure for a C++ library