2015-12-02 65 views
0

原始

我正在寻找一种为C库创建非隔离开发环境的方法。用于C库开发的虚拟环境

我将最有可能使用cmake建库,我的IDE是一个简单的文本编辑器。

现在的问题是,我不只是创建库但也有一些样本“应用程序”使用的库。 因此我需要在某处安装库的头文件和共享对象(我使用的是GNU/Linux),我不想将它安装到/usr/local/lib或(更糟糕的)/usr/lib

有没有一种方法创建一个类似于Python的pyvenv(以及类似),在那里我可以将一切安装到,但仍可以访问主机库的虚拟环境?

此外,我要重写我的$PATH/$LD_LIBRARY_PATH,建立一个虚拟机,容器,或chroot环境。

的使用会再看看这样的:

# switch to environment somehow 
loadenv library1 

# for library 
cd library 
make && make install 

# for application 
cd ../application1 
make && ./application1 

这可能吗?

编辑1

所以基本上我的目录结构如下所示:

library/ 
library/src/ 
library/src/<files>.c 
library/include/<files>.h 
application/ 
application/src/ 
application/src/<files>.c 

首先,我需要编译库,并安装二进制文件和头文件。 这些应该安装在假的系统位置。

然后我可以编译应用程序并运行它。

编辑2

我想到一点关于它,它似乎所有我需要的是一个文件系统,沙箱。 所以基本上我想打开一个shell,其中每次写入磁盘都不会提交给文件系统,而是暂时保存在文件系统中。一个ramfs/tmpfs只在shell退出时被删除。

这样我可以准确测试是否编译,部署并没有任何危险现有的文件或目录,而不会意外创建文件或目录,而清洁起来真机上执行的一切都将如何表现。

回答

1

你并不需要'安装'库,你可以在开发树中工作。 (1)编译所有你需要做的就是使用-I标志来指定库头文件的位置,这可以是一个相对路径,例如在你的情况下你可以做-I ../。 ./library/include

(2)用于连接你需要告诉图书馆在位于连接器,你可以使用-L标志追加到库搜索顺序。

(3)用于测试应用程序,你是正确的,因为应用程序需要能够找到图书馆。你有两个选择:

(一)确保库和可执行文件是在同一目录

(b)您可以临时修改LD_LIBRARY_PATH,只在当前的shell,来进行测试:

 export LD_LIBRARY_PATH=abs_path_to_library:$LD_LIBRARY_PATH 

注意,这只会影响你工作当前shell(命令终端)。任何其他壳可能已打开,或打开以后将有你的正常LD_LIBRARY_PATH。我知道你指定你不想修改你的PATH或LD_LIBRARY_PATH,但是作为命令执行的shell的本地,这是一个很好的,简单的方法。

(c)在客户端可执行文件中嵌入库的路径。为此,您需要将选项传递给链接器。海湾合作委员会的命令是:

 -Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH) 

看到this how-to

+0

谢谢你的回答,但是这不正是我想要的,我希望能够编译,部署和运行应用程序,如果库被安装在系统根目录下,所以我可以确定一切正常,但同时不会垃圾我的根文件系统。 – benaryorg

+0

@benaryorg,在这种情况下,您需要一个VM或至少一个chroot环境。这个要求从你原来的问题中是不清楚的,或者我的阅读理解能力随着我清醒的时间减少而增加。 – thurizas

+0

那么,在我的情况下,这并不是什么大问题,但它引起了我的注意,因为在那个方向似乎没有任何问题。 [portage](https://wiki.gentoo.org/wiki/Portage)使用名为'sandbox'的程序,该程序使用'$ LD_PRELOAD'以某种方式授予或阻止访问特定目录,但遗憾的是,它不支持临时存储数据。 – benaryorg