在编译时为运行时设置环境变量

时间:2018-10-07 18:52:26

标签: c++ linux g++ ld

我有一个C ++ Vulkan程序,该程序需要多个库才能在运行时可用。另外,Vulkan具有称为“验证层”的功能,该功能已通过配置文件进行配置。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

添加到编译行-Wl,-rpath ./path/to/lib1/,将lib1从LD_LIBRARY_PRELOAD列表中删除。需要-Wl,以便编译器将标志传递到链接器上,在该链接器中可以实际识别它。

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