我工作的一个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推荐阅读? 是否有一些很好的例子?
有一件事情是很常见的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的。)
我给你的建议是,你应该选择有意义的你 (和你的团队)的目录结构。 做什么是最明智的您所选择的开发环境,构建工具和源代码控制。
我不认为实际上有这方面的任何指引好。 大部分是只是个人喜好。 某些IDE的将决定你的基本结构,但。 Visual Studio中,例如,将打造其在调试分成独立的bin文件夹和子文件夹释放。 在VS,这使得当你使用不同的目标编译代码的意义。 (调试模式,释放模式)。
作为greyfade说,使用的布局,对你有意义。 如果别人不喜欢的话,他们将不得不重新调整它自己。 幸运的是,大多数用户会很乐意与您所选择的结构。 (除非它是真实的凌乱。)
我发现的wxWidgets库(开源)是一个很好的例子。 它们支持多种不同的平台(Win32中,的Mac OS X操作系统,Linux,FreeBSD的,Solaris和WinCE的...)和编译器(MSVC,GCC,CodeWarrior的,WATCOM等)。 你可以看到这里的树布局:
https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk/
还有,我最近碰到可能会有所帮助这真棒约定: 干草叉布局 (也GitHub上 )。
综上所述,第1.3条规定:
PFL规定,应该出现在项目树的根部几个目录。 并非所有的目录都是必需的,但他们有一个指定的目的,并在文件系统中没有其他目录可以假设这些目录中的一个角色。 也就是说,这些目录必须是在需要它们的目的所使用的那些。
其他目录中不应该出现在根目录下。
build/
:不应该被认为是该项目的源的一部分的特殊目录。 用于存储短暂的构建结果。 不得签入源代码控制。 如果使用源代码控制,必须使用源控制的忽略列表被忽略。
src/
:主编译源位置。 必须存在与不使用子模块编译组件项目。 在存在include/
,也包含私有头。
include/
:目录公共标题。 可能存在。 对于不私有/公共标题之间区分项目可以省略。 对于使用子模块项目可以省略。
tests/
:用于测试目录。
examples/
:对样品和实施例的目录。
external/
由项目使用目录的包/项目,但是不能编辑作为项目的一部分。
extras/
:包含项目额外/可选的子模块的目录。
data/
:包含项目的非源代码方面指南。 这可能包括图形和标记文件。
tools/
:包含目录开发工具,如建立和重构脚本
docs/
:项目文件目录。
libs/
:主工程子模块的目录。
另外,我觉得extras/
目录是你的Python绑定应该去 。
我可以用你的CMake真的建议......它是跨平台的开发,它是更灵活automake认为,使用CMake和你将能够编写跨平台的代码在所有系统上自己的猪病结构。