前几天,我在一个虚拟机上安装了一个Ubuntu,并收集了一些工具和库,这些工具和库我认为主要是用C++编程时需要的。
我有一个问题,比如第三方源代码库,等等。从我收集到的信息来看,很多源码发行版都假设它们的依赖项已经安装在某个特定的位置,并且假设很多工具也安装在特定的位置。
举一个我目前在Windows上做的例子,我有一个保存所有源代码的目录。C:\code。在此目录中,我有一个存放所有第三方库的目录,即c:\code\thirdparty\libs。通过这种方式,我可以轻松地为我编写或遇到并希望编译的任何项目的所有依赖项设置相对路径。我对设置linux编程环境感兴趣的原因是,工具和库依赖问题似乎都得到了有效的解决,这使得从源代码构建OpenSSH变得很容易。
因此,当我试图在linux上组织我的项目和库时,我所寻找的是一种易于维护和使用的得体的约定。
发布于 2008-10-21 21:58:55
简而言之:不要做“本地目录中的大量代码”的事情。
长答案:不要做“在本地目录中堆积代码”的事情,因为保持最新将是一场噩梦,如果您决定分发您的代码,那么为任何像样的分发打包它将是一场噩梦。
只要有可能,请坚持使用发行版中附带的库(ubuntu有20000+包,它应该预打包了您需要的大部分包)。如果没有包,你可以手动安装到/usr/local (但请看上面关于升级的内容,不要这么做)。
更好的做法是,使用"stow“或"installwatch”(或两者)将文件安装到每个库目录( /usr/local /stow/libA-ver123),然后将文件从那里符号链接到/usr/ local或/usr/ (stow执行简单链接部分)。或者只是为您的发行版打包lib。
发布于 2008-10-21 21:51:36
对于库/包含...
/usr/local/lib
/usr/local/include发布于 2008-10-22 09:15:50
在可能的情况下,针对系统/发行版提供的库编写代码。这使得在该发行版上发布产品变得最容易。
但是,如果您正在构建一个商业应用程序,因为Linux发行版的风格如此之多,这意味着您必须为每个发行版维护过多不同的应用程序构建。这不一定是一件坏事,因为这意味着你可以更干净地与发行版的包管理系统集成。
但是如果你不能做到这一点,那么下载你拥有的每个第三方依赖的源代码,并将该依赖的构建集成到一个链接到你的可执行文件的静态库中,应该是相当容易的。这样,您就可以确切地知道您正在链接的是什么,但也有膨胀可执行文件大小的缺点。如果您需要发行版没有提供的特定库(或版本),这也是必需的。
如果您希望您的代码构建在各种不同的Unix系统上,那么您可能会明智地研究GNU、autoconf和automake。这些帮助您为您的项目构建一个configure脚本和makefile,以便它可以在几乎任何Unix系统上构建。
另外,还可以查看pkg-config,它现在在Linux发行版上使用得很多,可以帮助您包含和链接到正确的库(对于支持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目录应该是空的,但它将通过以下方式与svn:externals元数据相关联:
svn propedit svn:externals trunk/libs此属性的内容类似于(假设subversion 1.5):
^/vendor/somelib/current somelib
^/vendor/anotherlib/1.0 anotherlib这意味着,当您签出代码时,subversion也会将您的供应商库签出到trunk/libs目录中。因此,当签出时,它看起来是这样的:
trunk/source
trunk/libs/somelib
trunk/libs/anotherlib在Subversion Book中对此进行了描述(可能要好得多)。特别是关于处理vendor branches和externals的部分。
https://stackoverflow.com/questions/223634
复制相似问题