前几天我在VM中安装了Ubuntu,然后去收集我认为需要用C ++编程的工具和库。
我遇到了一个问题,在哪里放置第三方源库等等。从我可以收集的内容来看,许多源代码分发假设它们的许多依赖项已经安装在某个位置并假设许多工具也安装在特定的位置。
举一个我目前在Windows上做的例子,我有一个保存所有源代码的目录。 C:\code
。在此目录中,我有一个所有第三方库的目录c:\code\thirdparty\libs
。通过这种方式,我可以轻松地为我编写或遇到的任何项目的所有依赖项设置相对路径,并希望进行编译。我对建立一个Linux编程环境感兴趣的原因是它似乎已经有效地解决了工具和库依赖问题,从而很容易从源代码构建OpenSSH。
所以我正在寻找的是一个不错的约定,当我尝试在linux上组织我的项目和库时,我可以使用它,易于维护和使用。
答案 0 :(得分:6)
简短的回答:不要做“本地目录中的大量代码”。
答案很长:不要在“本地目录”中执行“大量代码”,因为保持最新状态将是一场噩梦,如果您决定分发代码,那么打包它将是一场噩梦任何体面的分配。
只要有可能,坚持分发中提供的库(ubuntu有20000+个数据包,它应该包含大部分需要预先打包的内容)。如果没有软件包,您可以手动安装到/ usr / local(但请参阅上面有关升级的信息并且不要这样做)。
更好,使用“stow”或“installwatch”(或两者)安装到每个库目录(/ usr / local / stow / libA-ver123),然后将符号链接文件从那里安装到/ usr / local或/ usr /(stow是simlinking部分)。或者只为您的发行版打包lib。
答案 1 :(得分:5)
对于图书馆/包括......
/usr/local/lib
/usr/local/include
答案 2 :(得分:3)
尽可能针对system / distro提供的代码库。这使得在该发行版上发布产品变得最简单。
但是,如果您正在构建商业应用程序,因为有很多种类的Linux发行版可能意味着您必须为每个发行版维护大量不同的应用程序构建。这不一定是坏事,因为这意味着您可以更好地与发行版的包管理系统集成。
但是在你无法做到这一点的情况下,下载你拥有的每个第三方依赖项的来源应该相当容易,并将该依赖项的构建集成到链接到你的可执行文件的静态库中。这样你就可以准确地知道你所链接的内容,但却有可能缩小你的可执行文件大小。如果您需要发行版未提供的特定库(或版本),也可能需要这样做。
如果您希望您的代码可以在各种不同的Unix系统上构建,那么您可能很明智地研究GNU autoconf和automake。这些可以帮助您为项目构建configure
脚本和makefile
,以便它几乎可以在任何Unix系统上构建。
另请查看现在在Linux发行版上使用的pkg-config,以帮助您包含并链接到正确的库(对于支持pkg-config的库)。
如果您使用subversion来管理源代码,那么大多数subversion存储库都会使用“约定”来管理自己的代码和“供应商”代码。
大多数svn存储库都有一个“供应商”树(与树干,分支和标签树一起)。这是所有第三方供应商代码的首选。在该目录中,您可以使用每个库的目录。例如:
branches/
tags/
trunk/
vendor/somelib
vendor/anotherlib
每个库下面都是每个库版本的目录,以及存储库中最新版本的“当前”目录。
vendor/somelib/1.0
vendor/somelib/1.1
vendor/somelib/current
然后你的项目的树应该是这样的:
trunk / source#这里的所有代码 trunk / libs#所有供应商代码在这里
libs目录应为空,但它将与{1}}元数据相关联,通过:
svn:externals
这个属性的内容将是(假设颠覆1.5):
svn propedit svn:externals trunk/libs
这意味着当您签出代码时,subversion还会将您的供应商库检出到您的trunk / libs目录中。因此,当签出时,它看起来像这样:
^/vendor/somelib/current somelib
^/vendor/anotherlib/1.0 anotherlib
Subversion Book中描述了(可能好多了很多)。特别是关于处理vendor branches和externals。
的部分答案 3 :(得分:1)