5

我正在使用 setenv 设置 DYLD_LIBRARY_PATH,因此当我执行 dlopen() 时,它将具有找到我的 .dylib 的正确路径,但是当我执行 dlopen() 时,它似乎没有搜索我添加到 DYLD_LIBRARY_PATH 的路径。

从我可以收集到的内容中,我对 DYLD_LIBRARY_PATH 的更改在重新执行我的过程之前不会生效。它是否正确?

此外,如果这是正确的,有没有办法设置 DYLD_LIBRARY_PATH 并让我的更改工作而无需重置我的流程。

哦,是的,我在 MAC OSX 上编写了这段代码。

提前致谢。

4

2 回答 2

5

我不了解 Mac OS,但在 Linux 上,加载程序会在可执行文件的第一条指令运行之前读取getenv("LD_LIBRARY_PATH") 一次的值并将其保存起来。程序的后续修改LD_LIBRARY_PATH只会影响它的任何子execve()进程,而不会影响进程本身。我想它在 Mac OS 上是相似的。

解决这个问题的常用方法是重新execve处理过程(Java 这样做),或者使用设置环境的 shell 包装器,然后执行真正的二进制文件(Firefox 这样做)。

可能有一种特定于 Mac OS 的方式来更新库搜索路径,尽管 Google 似乎没有找到任何匹配项。我很确定Linux 上没有任何这样的机制。

于 2011-07-18T03:29:38.233 回答
2

我的问题的答案是否定的,如果不重新执行 LD_LIBRARY_PATH 上的进程以使环境变量对 dlopen 生效,就不能使用 setenv。

我发现您应该使用@exectuable_path、@loader_path 或@rpath 作为我的.dylb 上的安装名称路径,这样您就可以从dlopen 对您的.dylibs 进行相对路径搜索。

于 2011-07-25T21:12:22.803 回答