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

ami*_*421 6 c++ linux

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

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

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

Gal*_*lik 10

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

我存储了我的项目,$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
Run Code Online (Sandbox Code Playgroud)


Dav*_*ica 7

Linux 发行版之间的实现略有不同,但都在很大程度上寻求实现 Linux文件系统层次结构标准。有些发行版比其他发行版更重要。最新版本是2.3,可以通过上面 URL 中的链接或直接通过FHS 2.3 PDF 查看

花点时间查看文档并将其与 Ubuntu 使用的实现进行比较。它将为您提供有关文件在 Linux 中的位置和原因的良好背景,并为您提供一个快速课程,让您了解这更像是发行版的目标而不是硬性要求,因为发行版几乎可以免费使用把东西放在任何他们想要的地方。


Gru*_*bel 6

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

  • 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/"; \
}       
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的末尾隐藏着宝石...... (2认同)