我正在寻找一种为C库创建非隔离开发环境的方法。
我很可能会使用cmake
来构建库,而我的IDE是一个简单的文本编辑器。
现在的问题是我不仅使用库创建库而且还创建了一些示例“应用程序”。
因此,我需要在某处安装库的头文件和共享对象(我使用的是GNU / Linux),我不想将它安装到/usr/local/lib
或(更糟糕的)/usr/lib
。
有没有办法创建一个类似于python的pyvenv(和类似的)的虚拟环境,我可以安装所有东西,但仍然可以访问主机库?
我也不想要重写我的$PATH
/ $LD_LIBRARY_PATH
,设置VM,容器或chroot。
用法如下:
# switch to environment somehow
loadenv library1
# for library
cd library
make && make install
# for application
cd ../application1
make && ./application1
这可能吗?
基本上我的目录结构如下所示:
library/
library/src/
library/src/<files>.c
library/include/<files>.h
application/
application/src/
application/src/<files>.c
首先,我需要编译库并安装二进制文件和头文件。 这些应安装在虚假的系统位置。
然后我可以编译应用程序并运行它。
我想了一下它,似乎我只需要一个文件系统沙箱。 所以基本上我想打开一个shell,每次写入磁盘都没有提交给文件系统,而是暂时保存在例如只有在shell退出时才会删除ramfs / tmpfs。
通过这种方式,我可以准确地测试在真实机器上编译,部署和执行时一切都会如何表现,而不会对现有文件或目录造成任何危险,也不会在没有清理的情况下意外创建文件或目录。
答案 0 :(得分:2)
你真的不需要安装&#39;在图书馆,您可以在开发树中工作。
(1)对于编译,你需要做的就是使用-I标志来指定库头文件的位置,这可以是一个相对路径,例如你可以做-I ../ .. /库/包括
(2)对于链接,你需要告诉链接器库所在的位置,你可以使用-L标志附加到库搜索顺序。
(3)对于测试应用程序,您认为应用程序需要能够找到库是正确的。你有几个选择:
(a)确保库和可执行文件位于同一目录
(b)您可以暂时修改当前shell中的LD_LIBRARY_PATH
进行测试:
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