2008-10-21 95 views
2

有一天,我在虚拟机中安装了一个unbuntu安装程序,然后去收集我认为在C++中编程moslty所需的工具和库。Linux编程环境配置

我虽然有一个问题,在哪里放的东西,如第三方代码库等。从我所知,很多源代码分发的假设,有很多他们的依赖已经安装在某个位置,并承担很多工具也安装在特定的位置。

举一个我目前在windows上做的例子,我有一个目录,我保留所有的源代码。 C:\代码。在这个目录中,我有一个所有第三方库的目录,c:\ code \ thirdparty \ libs。通过这种方式,我可以轻松地为我编写或想要编译的任何项目的所有依赖项设置相对路径。我有兴趣设置一个Linux编程环境的原因是,似乎工具和库依赖问题已经得到有效解决,例如从源代码构建OpenSSH很容易。

所以我一直在寻找的是一个体面的对话,当我试图在linux上对我的项目和库进行编程时,我很容易维护和易于使用。

回答

5

对于库/包括......

/usr/local/lib 
/usr/local/include 
1

的Ubuntu = = Debian的apt-get的善良

开始Linux Utilities

%> sudo apt-get install util-linux 
6

简短的回答:不做“堆在本地dir代码“的东西。

长的答案:不要在本地dir中做一堆“代码”的事情,因为这将是噩梦保持最新,如果你决定分发你的代码,它将是噩梦它适合任何体面的发行。

只要有可能,坚持发行版中的库(Ubuntu有20000+包,它应该有大部分你需要预先包装)。当没有软件包时,可以手动安装到/ usr/local(但请参阅上面有关升级的内容并且不要这样做)。

更好的是,使用“stow”或“installwatch”(或两者)安装到每个库目录(/ usr/local/stow/libA-ver123),然后将文件从/ usr/local或/ usr /(stow做simlinking部分)。或者只是为你的发行版打包lib。

3

可能的代码针对系统/发行版提供的库。这使得在该发行版上发布产品变得最容易。

但是,如果你正在构建一个商业应用程序,因为有这么多的Linux发行版,这意味着你必须为每个发行版维护大量不同的应用程序版本。这不一定是坏事,因为这意味着你可以更干净地与发行版的包管理系统集成。

但是在不能这样做的情况下,应该很容易下载每个第三方依赖关系的源代码,并将该依赖关系的构建集成到与您的可执行文件链接的静态库中。这样你就可以确切地知道你连接的是什么,但是却有膨胀你的可执行文件大小的缺点。如果您需要发行版未提供的特定库(或版本),也可能需要此功能。

如果您希望您的代码构建在各种不同的Unix系统上,那么您可能会明智地考虑GNU autoconfautomake。这些帮助你为你的项目构建一个configure脚本和makefile,这样它就可以建立在任何Unix系统上。

另请参阅pkg-config,它现在在Linux发行版上使用很多,可以帮助您包含并链接到正确的库(用于支持pkg-config的库)。

如果你使用Subversion来管理你的来源有一个“惯例”,大多数颠覆仓库用来管理他们自己的代码和“供应商”的代码。

大多数svn软件仓库都有一个“供应商”树(随树干一起分支,树枝分支&)。这是所有第三方供应商代码的首选。在该目录中,您使用了每个库的目录。例如:

branches/ 
tags/ 
trunk/ 
vendor/somelib 
vendor/anotherlib 

下面的每个这些库的是每个库的版本和最先进的最新版本在你的仓库“当前”目录的目录。在这里

libs目录应该

主干/来源#所有的代码在这里 主干/林达#所有供应商代码:

vendor/somelib/1.0 
vendor/somelib/1.1 
vendor/somelib/current 

那么你的项目的树应当设置是这样的为空,但它必须与它相关svn:externals元数据,通过:

svn propedit svn:externals trunk/libs 

此属性的内容是一些沿线的东西(假设颠覆1.5):

^/vendor/somelib/current somelib 
^/vendor/anotherlib/1.0 anotherlib 

这意味着,当你结帐代码颠覆还检查出你的供应商库到你的躯干/ libs目录。所以,当检查了它看起来像这样:

trunk/source 
trunk/libs/somelib 
trunk/libs/anotherlib 

这在Subversion Book描述(可能是好多了)。特别是关于处理vendor branchesexternals的部分。