从开发人员的angular度看linux文件夹结构

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

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

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

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

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

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

我使用eclipse并将其工作空间指向$HOME/dev

图书馆典型的地方在哪里? 二进制文件和仅包含头文件的库有不同的地方吗?

通常将库安装到/usr/lib ,头文件安装到/usr/include

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

通常这些安装到/usr/bin 。 我也把工具放在$HOME/bin ,特别是如果我制作的话。

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

我也运行GCC 4.9.2 Fedora 21 ,但是我已经在/opt/gcc-5.1.0安装了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 

Linux发行版之间的实现有所不同,但大部分都试图实现Linux 文件系统层次结构标准 。 一些发行比其他发行更多。 最新的版本是2.3 ,可以通过上面的URL链接或直接通过FHS 2.3 PDF查看

花点时间查看文档,并将其与Ubuntu使用的实现进行比较。 它将为您提供一个很好的背景知道文件位于Linux中的位置和原因,还可以为您提供一个简短的课程,介绍如何将这些文件作为分发目标而不是硬性要求 ,因为分发版本几乎可以免费使用把东西放在他们想要的地方

至于你的项目源码树布局,一个常见的设置如下所示:

  • 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/"; \ }