【问题标题】:dynamic linking:change of the linking path动态链接:改变链接路径
【发布时间】:2010-03-29 11:30:03
【问题描述】:

通常情况下,当必须在 LD_LIBRARY_PATH 中定义必须动态链接的库的路径时,或者在创建二进制文件时会用 -L 标志提及它。

在实际场景中,假设二进制文件已在客户端构建和部署。 现在如果动态链接库路径之一的路径发生变化。 那么我们需要为部署了二进制文件的所有客户端提供一个新的 make 文件。

有没有其他方法我们不需要告诉所有客户端更改他们的makefile,并且可以在代码本身中完成某些事情? 如果是的话...有人可以建议怎么做吗?

讽刺的是,这是一个问我的面试问题,我没有答案。

编辑:有人特别问我,在不接触 makefile 的情况下可以在代码中做什么。

【问题讨论】:

  • LD_LIBRARY_PATH 与链接无关。它仅适用于运行时。

标签: c++ c unix dll


【解决方案1】:

通常您应该只更改LD_LIBRARY_PATH,除非这可能与使用硬编码搜索路径的编译相关:rpath

【讨论】:

    【解决方案2】:

    也许面试官想了解 dlopen 和 dlsym? http://linux.die.net/man/3/dlsym

    【讨论】:

    • 是的......这可能是他们所期待的。非常感谢正确的方向。
    【解决方案3】:

    使用环境变量,如MYLIBPATH,并在你的makefile中使用这个变量,而不是硬编码的值。

    所以每个客户端都可以有自己的目录结构,只要正确指定MYLIBPATH,你的程序就可以构建。

    或者你可以在你的makefile中寻找库,像这样

    LIBPATH = $(shell find / -name libmylib.a -exec dirname {} ";" -quit)
    
    myprog: myprog.c
            $(CC) myprog.c -lmylib -L$(LIBPATH)
    

    编辑: locate 替换为 find,它只返回与 -quit 选项的第一个匹配项

    【讨论】:

    • 是的..这实际上是我的答案......但这没有得到专家组的同意。他们想要可以在代码中完成的某事
    • 查看更新的答案 - 它使用 POSIX find 所以它必须在所有 Unix 上都可以
    • 使用环境变量是正确的答案。专家组认为应该以另一种方式完成与这里无关。我们无法读懂他们的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2019-02-21
    • 2013-12-24
    • 2015-03-12
    • 2017-11-06
    • 2019-01-24
    相关资源
    最近更新 更多