[英]Directory structure for a C++ library
我正在使用C ++库。 最终,我想将其与一些示例和Python绑定一起公开提供给多个平台(至少是Linux和Windows)。 工作进展顺利,但目前该项目非常混乱,仅针对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
...
我以前对多平台开发/开放源代码项目没有/只有很少的经验,并且很惊讶我找不到关于如何构建这样的项目的任何良好指南。
通常应该如何组织这样的图书馆项目? 建议阅读什么? 有没有很好的例子?
在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。)
我的建议是,您应该选择一个对您 (以及您的团队) 有意义的目录布局。 做最适合您选择的开发环境,构建工具和源代码控制的事情。
我认为实际上没有任何好的指导方针。 大多数只是个人喜好。 不过,某些IDE将为您确定基本结构。 例如,Visual Studio将创建一个单独的bin文件夹,该文件夹分为Debug和Release子文件夹。 在VS中,当您使用不同的目标来编译代码时,这才有意义。 (调试模式,发布模式。)
正如greyfade所说,请使用对您有意义的布局。 如果其他人不喜欢它,他们只需要自己重组即可。 幸运的是,大多数用户会对您选择的结构感到满意。 (除非真的很乱。)
我发现wxWidgets库(开源)是一个很好的例子。 它们支持许多不同的平台(Win32,Mac OS X,Linux,FreeBSD,Solaris,WinCE ...)和编译器(MSVC,GCC,CodeWarrior,Watcom等)。 您可以在此处看到树的布局:
我最近遇到的一个很棒的约定可能对您有所帮助: Pitchfork布局 (也在GitHub上 )。
综上所述,第1.3小节指出:
PFL规定了几个目录,这些目录应出现在项目树的根目录下。 并非所有目录都是必需的,但是它们具有指定的用途,并且文件系统中的其他任何目录都不能承担这些目录之一的角色。 也就是说,如果需要它们,这些目录必须是使用的目录。
其他目录不应出现在根目录下。
build/
:特殊目录,不应被视为项目源代码的一部分。 用于存储临时构建结果。 不得将其签入源代码管理。 如果使用源代码管理,则必须使用源代码管理忽略列表将其忽略。
src/
:主要可编译源位置。 对于具有不使用子模块的已编译组件的项目,必须存在。 在include/
的情况下,还包含私有头。
include/
:公共头的目录。 可能存在。 对于不区分私有/公共标题的项目,可以省略。 对于使用子模块的项目,可以省略。
tests/
:测试目录。
examples/
:样本和示例的目录。
external/
:项目要使用但未作为项目一部分进行编辑的软件包/项目的目录。
extras/
:包含项目的额外/可选子模块的目录。
data/
:包含项目非源代码方面的目录。 这可能包括图形和标记文件。
tools/
:包含开发实用程序的目录,例如构建和重构脚本
docs/
:项目文档目录。
libs/
:主要项目子模块的目录。
另外,我认为extras/
目录是您的Python绑定应放置的目录。
我真的可以推荐您使用CMake ...它是用于跨平台开发的,它可以更灵活地进行自动制作,使用CMake,您将能够在所有系统上使用自己的direcory结构编写跨平台代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.