原创
我正在寻找一种为 C 库创建非隔离开发环境的方法。
我很可能会使用 cmake
来构建库,我的 IDE 是一个简单的文本编辑器。
现在的问题是我不仅创建了库,还创建了一些使用该库的示例“应用程序”。
因此,我需要在某处安装库的 header 和共享对象(我正在使用 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) 对于编译,您需要做的就是使用 -I 标志来指定库头文件的位置,这可以是相对路径,例如在您的情况下您可以执行 -I../../图书馆/包括
(2) 为了链接你需要告诉链接器库所在的位置,你可以使用 -L 标志附加到库搜索顺序。
(3) 对于测试应用程序,您认为应用程序需要能够找到库是正确的。您有几个选择:
(a) 确保库和可执行文件在同一目录中
(b) 您可以暂时修改您的 LD_LIBRARY_PATH
,仅在您当前的 shell 中,用于测试:
export LD_LIBRARY_PATH=abs_path_to_library:$LD_LIBRARY_PATH
请注意,这只会影响您正在使用的当前 shell(命令终端)。您可能已打开或稍后打开的任何其他 shell 将具有您的正常 LD_LIBRARY_PATH。我知道您指定不想修改您的 PATH 或 LD_LIBRARY_PATH,但是对于执行命令的 shell 来说,这是一种很好、很简单的方法。
(c) 在客户端可执行文件中嵌入库的路径。为此,您需要将一个选项传递给链接器。 gcc 的命令是:
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
参见 this how-to
关于c - C 库开发的虚拟环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055140/