【问题标题】:Setting environment variables for run-time in compile-time在编译时为运行时设置环境变量
【发布时间】:2018-10-07 18:52:25
【问题描述】:

我有一个 C++ Vulkan 程序,它需要多个库才能在运行时可用。此外,Vulkan 有一个名为“验证层”的功能,它使用配置文件进行配置。

在运行时,我的程序需要知道这些库在哪里以及配置文件在哪里。我猜没有办法以编程方式进行,但如果有,请告诉我。为了解决这个问题,我设置了环境变量,即 LD_LIBRARY_PATH(用于查找库)和 VK_LAYER_PATH(用于查找 Vulkan 的验证层配置文件)。

这可行,但我想要一种更好的方法来执行此操作,因为这不允许我简单地双击文件并运行它。我必须首先设置环境变量,如果我正在部署程序,这很糟糕。

我的问题是:是否有编译器/链接器选项可以做到这一点?

这是我在 makefile 中使用的解决方法:

run:
    LD_LIBRARY_PATH=./path/to/lib1/:./path/to/lib2 VK_LAYER_PATH=./path/to/vulkan/config ./program_name

我正在使用 Linux、g++ 和 make。

【问题讨论】:

  • 我正在为 Linux 开发 Linux,至少目前是这样。很抱歉造成混乱。
  • @πάνταῥεῖ 谢谢。我略过了。
  • 无需道歉。没有更仔细地阅读最后一句话是我自己的错。您应该检查 configure 和 autoconf。 (我知道的只是这些工具存在并且可能可以帮助您解决这个特定问题。)

标签: c++ linux g++ ld


【解决方案1】:

如果您知道需要链接的库将安装在哪里,您可以设置一个 rpath。这会将搜索路径添加到 ELF 标头。当动态链接器运行时,除了默认位置之外,它还将搜索这些位置。

添加到您的编译行 -Wl,-rpath ./path/to/lib1/ 以从 LD_LIBRARY_PRELOAD 列表中删除 lib1。 -Wl 是必需的,以便编译器将标志传递给实际识别它的链接器。

This blog seems to have a good description of all the different options

【讨论】:

  • 我已经阅读了 rpath 并且它似乎是一个很好的解决方案。两个问题:我可以有多个 rpath(每个 lib 路径一个);问题的 vulkan 部分呢?尽管它不是那么重要,因为它是一个调试功能,但我仍然希望它更简洁。
  • @DanielMarques 是的,您可以多次提供 -Wl,-rpath 参数以添加多个 rpath。我以前没有使用过 Vulkan,所以我无法真正帮助你。如果您只想双击某些内容,您可以创建一个可执行脚本来设置适当的环境,然后运行您的程序。
猜你喜欢
  • 2022-01-14
  • 2020-04-06
  • 2020-10-22
  • 2020-01-12
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多