从开发人员角度看Linux文件夹结构

时间:2015-04-24 18:35:05

标签: c++ linux

我对Linux文件系统比较陌生,所以你能帮助我吗?我必须使用Ubuntu编写一个示例C ++项目(测试) 你能从开发人员的角度用文件/文件夹结构来澄清我吗?以下是我想回答的一些问题:

  • 项目的典型位置(来源,目标文件等)在哪里?
  • 开发环境的典型位置(Eclipse,QT Creator等)在哪里?
  • 图书馆的典型地方在哪里?二进制文件和仅标题库是否存在不同的位置?
  • 各种开发工具(代码分析器,git客户端等)的典型位置在哪里?

答案和链接将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:8)

  

项目的典型位置(来源,目标文件等)在哪里?

我将项目存储在$HOME/dev中,但完全取决于您。

  

开发环境的典型位置(Eclipse,QT Creator等)在哪里?

我使用eclipse并将其工作空间设置为$HOME/dev

  

图书馆的典型地方在哪里?二进制文件和仅标题库是否有不同的位置?

通常,库安装到/usr/lib,标头安装到/usr/include

  

各种开发工具(代码分析器,git客户端等)的典型位置在哪里?

通常会将这些内容安装到/usr/bin中。我还将工具放在$HOME/bin中,特别是如果我制作它们。

但它比那更复杂。如果您希望使用与Linux发行版附带的库版本不同的库开发/测试应用程序,该怎么办?有时我会在$HOME/dev文件夹中安装不同的库版本,并针对这些版本而不是系统版本进行编译。

我还运行Fedora 21附带的GCC 4.9.2,但我已将GCC 5.1.0安装到/opt/gcc-5.1.0并将其用于某些事情。

我的典型项目结构如下:

$HOME/
     /dev/
         /my-prog/
                 /src/
                     /include/
                             /my-prog.h
                     /my-prog.cpp
                 /build-debug/
                             /src/
                                  /my-prog
                 /build-release/
                               /src/
                                   /my-prog
                 /Makefile

答案 1 :(得分:4)

Linux发行版之间的实现方式有所不同,但大多数都试图实现Linux Filesystem Hierarchy Standard。有些分布比其他分布更多。最新版本 2.3 ,可以通过上面的网址中的链接查看,也可以直接通过FHS 2.3 PDF

查看

花时间查看文档并将其与Ubuntu使用的实现进行比较。它将为您提供有关文件位于Linux所在位置和原因的良好背景知识,并为您提供快速课程,让您快速了解这对于分发而言是多么强目标而非强硬要求,因为发行版几乎可以自由地放置任何他们想要的东西。

答案 2 :(得分:2)

对于项目源树布局,常见设置如下所示:

  • src/这是您的.cpp档案
  • include/表示在编写库时应安装的标题
  • data/是图形,图标,声音等的地方
  • external/用于您的项目所需的git子模块或外部库,并且模糊不清,以至于您不希望用户手动安装它们
  • 顶级目录中的构建文件(历史上使用autoconf / automake,但是现在CMake似乎更受欢迎)
  • 一个README或README.md,解释了项目的作用以及它需要的依赖性

命名和组织当然可以在不同项目之间变化,没有真正的标准,有些使用Source/而不是src/。有些可能在src/目录中有标题,依此类推。它完全取决于您的项目需求。如果库通常随大多数发行版一起提供,则不需要将其包含在源树中。与大多数编程工具相同,git,gcc和Co.由Linux发行版提供,您不必担心它们的去向。

如果您正在撰写图书馆,可能还需要查看pkg-config.so命名规则。

对于安装目录,FHS详细解释了简短摘要:

  • /usr/bin可执行文件
  • 公共图书馆的
  • /usr/lib
  • 私人图书馆的
  • /usr/lib/${APPNAME}
  • /usr/include用于公共标头文件
  • /usr/share/${APPNAME}用于数据文件
  • 一些商业产品使用
  • /opt/${APPNAME}而不是通过层次分析
  • 传播数据

/usr本身是为分发安装的软件包保留的,手动编译的东西应该转到/usr/local。大多数构建系统都有一个--prefix=PREFIX选项,允许用户更改它。

如果您需要自己编译库,我通常会建议避免将其安装到/usr/local中,因为从那里卸载软件很困难,这也使得无法保留相同软件的不同版本。同时。

而是将软件安装到它自己的PREFIX中,例如~/run/somelibrary-0.0.1。然而,以这种方式安装软件的缺点是工具无法找到它。您可以通过设置一些环境变量来解决这个问题,我为此目的使用了一个简单的bash函数:

function activateprefix {
    PREFIX="$1"; \
    export PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig/"; \
    export LD_LIBRARY_PATH="${PREFIX}/lib/"; \
    export LD_RUN_PATH="${PREFIX}/lib/"; \
    export LIBRARY_PATH="${PREFIX}/lib/"; \
    export CPLUS_INCLUDE_PATH="${PREFIX}/include/"; \
    export C_INCLUDE_PATH="${PREFIX}/include/"; \
}