C ++跨平台库和绑定的最佳文件夹结构

时间:2009-04-05 00:38:03

标签: c++ cross-platform

我即将开始使用C ++编写的跨平台库。接下来,我打算为其他语言实现绑定,例如Python,Java等。这些库需要在主要平台上可用:win32,Linux和Mac OSX。

虽然该应用程序实际上是一个库,但是一些基本的控制台程序将与它捆绑在一起进行演示和测试。

在开始在Subversion中存储内容之前,我想提出一个最佳的文件夹结构。

我想的是:

/project                    //Top level folder

        /bin                //Binaries ready for deployment
            /linux_amd64    //Linux AMD64 platform
                  /debug    //Debug build - duplicated in all platforms
                  /release  //Release build - duplicated in all platforms
            /linux_i386     //Linux 32-bit platform
            /macosx         //Mac OS X
            /win32          //Windows 32-bit platform
                  /cygwin   //Windows 32-bit platform compiled with Cygwin
                  /vs.net   //Windows 32-bit platform compiled with Visual Studio .NET
            /win64          //Windows 64-bit platform

        /build              //Make and build files, IDE project files
            /linux_amd64    //Linux AMD64 platform
            /linux_i386     //Linux 32-bit platform
            /macosx         //Mac OS X
            /win32          //Windows 32-bit platform
            /win64          //Windows 64-bit platform

        /config             //Configuration files that accompany the binaries

        /data               //Data files that accompany the binaries

        /doc                //Documentation

        /lib                //External or third-party libraries
            /platforms      //Platform-specific code for ...
                      /linux_amd64    //Linux AMD64 platform
                      /linux_i386     //Linux 32-bit platform
                      /macosx         //Mac OS X
                      /win32          //Windows 32-bit platform
                      /win64          //Windows 64-bit platform
            /src            //Available library source code in subfolders

        /src                //Source code tree - this will contain main.cpp
            /bindings       //Bindings to other languages such as ...
                      /python
                      /java
            /h              //Header files
            /modules        //Platform-independent modules, components or subprojects
            /platforms      //Platform-specific code for ...
                      /linux_amd64 //Linux AMD64 platform-specific code
                      /linux_i386  //Linux 32-bit platform-specific code
                      /macosx
                      /win32       //Windows 32-bit platform-specific code
                      /win64       //Windows 64-bit platform

        /test               //Automated test scripts

如果你有建议,我很乐意听到。我想知道是否有一种工具可以帮助创建这种结构。

我打算使用CMake和Subversion。

4 个答案:

答案 0 :(得分:10)

结构对我来说很好,但有几点:

  • 将C ++标头和源文件分成不同的目录是正常的,或者模块目录中是否有未显示的结构?
  • 您可能希望目录将* .obj等中间文件放入
  • 您需要不同的目录来调试和发布输出文件
  • 像InnoSetup这样的安装程序的目录及其安装文件可能很有用 - 您必须做出关于是否版本控制这些
  • 的哲学决定

至于创建结构的工具,只需几分钟就可以编写一个bash脚本 - 所有平台都可以使用相同的工具(如bash)。

答案 1 :(得分:7)

为什么二进制文件需要不同的平台文件夹?您将在不同的平台下使用相同的文件系统构建此源代码吗?

如果是,我认为你也需要特定于编辑器的文件夹。

为什么不使用不同的文件夹进行调试和发布构建,可能是unicode和非unicode,单线程或多线程构建?

看看bjam或Scons做替换者。也许你不需要构建目录中的不同文件夹。

我认为如果“modules”目录中的所有模块都包含测试用户的“tests”目录会更好。


最后 - 看看boost库,这个platofrm独立库有很好的结构。

还尝试从其他平台独立项目中获取想法。

提升文件夹结构:

boost - root dir
- boost - library header lib ( for users )
- libs - library source dir ( one dir per lib )
    - build - library build files ( if they are needed )
    - doc - documentation files
    - example - sample programs
    - src - library source files
    - test - programs and srcipts for testing module
- bin - created by bjam build system
    - libs
        - <lib-name>
            for all compiled folders from libs [example|test|build]
                - <compiler-name>/<[static|dynamic]-link>/<[debug|release]>/<[threading mode]>
                    contain builded [obj|dll|lib|pdb|so|o|etc] files see detailed information in bjam build system

- doc
- tools

如果您选择bjam - 您将不会担心构建和bin文件夹结构。

此外,您的libs / src / dir可以包含所有平台文件的自己,并且可以包含平台特定文件的dirs。

我没有在你的文件夹结构中看到任何严重的问题,也许你会在开始编写项目原型时看到它们。

答案 2 :(得分:2)

我最近在一个目录中发布了question about packaging headers,决定使用少量包含目录。

你打算迎合Win64吗?这将是一个越来越重要的目标。

将构建中间文件放在被检入svn的树下的任何位置。如果你这样做,根据你的svn客户端工具,它们会产生很多噪音,因为文件不在存储库中。这使你很难看到你添加的文件应该在存储库中。

相反,如果您的编译器允许,请将中间目录放在一边。

否则,请确保将整个中间目录添加到svn排除属性中。有些GUI比其他GUI更容易(Windows上的Tortoise,Cornerstone或OS / X上的版本)。

答案 3 :(得分:0)

我可能建议不使用该架构对构建文件进行分类吗?

我试图应用您建议的文件夹结构,但我找不到放置常见Linux Makefile定义和Visual Studio属性文件的正确位置。如下所示:

/project
   /build
      /linux
      /macosx
      /win32 (or win)

示例案例包括:

/project
   /build
      /linux
         Make.defs
         Makefile  [i386, amd64]
      /win32
         /VC8
            /<project>
               <project>.vcproj
            <solution>.sln  [Win32, x64]
         /VC11
            /<project>
               <project>.vcxproj
            <solution>.sln  [Win32, x64, ARM]

如果您不想通过配置定义体系结构构建,那么平台类型下的另一个文件夹层呢?

/project
   /build
      /linux
         /linux_amd64
         /linux_i386
      /macosx
         /?
      /win32 (or win)
         /win32
         /win64

如果给定项目没有平台的任何公共构建文件,原始结构就足够了。