C ++库的目录结构


80

我正在使用C ++库。最终,我想将其与一些示例和Python绑定一起公开提供给多个平台(至少是Linux和Windows)。工作进展顺利,但目前该项目非常混乱,仅针对Visual C ++内置且仅针对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
    ...

我以前在多平台开发/开源项目上没有/只有很少的经验,并且很惊讶我找不到关于如何构建这样的项目的任何良好指导。

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


Answers:


104

在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。)

我的建议是,您应该选择一个对您(以及您的团队)有意义的目录布局。做对您选择的开发环境,构建工具和源代码控制最明智的事情。


3
使用CMake时,源外构建似乎很棒。
Korchkidu 2012年

11

我最近遇到的一个很棒的约定可能对您有所帮助:Pitchfork布局(也在GitHub上)。

综上所述,第1.3小节指出:

PFL规定了几个目录,这些目录应出现在项目树的根目录下。并非所有目录都是必需的,但是它们具有指定的用途,并且文件系统中的其他目录都不能承担这些目录之一的角色。也就是说,如果需要它们,这些目录必须是所使用的目录。

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

build/:特殊目录,不应被视为项目源的一部分。用于存储临时构建结果。不得将其签入源代码管理。如果使用源代码管理,则必须使用源代码管理忽略列表将其忽略。

src/:主要可编译源位置。对于具有不使用子模块的已编译组件的项目,必须存在。在的情况下include/,还包含私有标头。

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

tests/:测试目录。

examples/:样本和示例的目录。

external/:项目要使用的软件包/项目的目录,但未作为项目的一部分进行编辑。

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

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

tools/:包含开发实用程序的目录,例如构建和重构脚本

docs/:项目文档目录。

libs/:主要项目子模块的目录。

另外,我认为该extras/目录是您的Python绑定放置的目录。


4

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

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



-1

我真的可以推荐您使用CMake ...它是用于跨平台开发的,它可以使自动制作,使用CMake更加灵活,并且您将能够在所有系统上使用自己的direcory结构编写跨平台代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.