我对Linux文件系统比较陌生,所以你能帮助我吗?我必须使用Ubuntu编写一个示例C ++项目(测试) 你能从开发人员的角度用文件/文件夹结构来澄清我吗?以下是我想回答的一些问题:
答案和链接将不胜感激。谢谢。
答案 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子模块或外部库,并且模糊不清,以至于您不希望用户手动安装它们命名和组织当然可以在不同项目之间变化,没有真正的标准,有些使用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/"; \
}