c - C 库开发的虚拟环境

标签 c linux shared-libraries development-environment

原创

我正在寻找一种为 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/

相关文章:

linux - Linux 程序如何知道库文件在哪里以及如何调用它们?

c++ - 在 Linux 上,为什么析构函数在 C++ 中的全局变量共享实例上运行两次?

c - C结构序列化中的结构填充影响(保存到文件)

linux - 如何安装特定版本的postgres?

linux - 确定线程的堆栈大小和位置

c - Linux何时/如何将共享库加载到地址空间中?

c - 使用线程的多文件访问

c - 在 C 中使用指针将数组传递给函数?

c - 如何在 C 中绘制漂亮的 ASCII 表?

linux - 我的虚拟服务器 Linux 无法连接到互联网