【问题标题】:How can I link with a directory which might not exist while running?如何链接到运行时可能不存在的目录?
【发布时间】:2011-10-10 09:56:50
【问题描述】:

我正在为 Linux 编写一个库,它具有一些依赖于共享库 libfoo.so 的功能。

我正在尝试考虑 libfoo.so 不存在的情况。对于这种情况,我有一个明确定义的行为,但我不知道如何正确实现它,明智的链接。

目前,我的库是针对 libfoo.so 编译的,当客户端尝试在不包含 libfoo.so 的环境中针对它编译代码时,会出现链接错误。

我的问题是,我如何构建我的库,即使 libfoo.so 不存在,它也会编译,但行为不同。我自己能想出的唯一解决方案是从它分支一个不支持 foo 的版本,但必须有更好的方法......

提前致谢

由于给出的答案而进行的跟进: 似乎不链接 libfoo 而是使用 dlopen 动态加载它可以解决问题,但它需要我手动导出所有符号,并且范围有限......是否有任何“不那么痛苦”来实现这一目标?

【问题讨论】:

    标签: c++ linker shared-libraries


    【解决方案1】:

    有两个不同的问题适合描述,这取决于是在编译时还是在运行时检测库的存在。

    在编译时,您将不得不使用一些工具来检测库是否存在并修改构建脚本以将该信息传递给代码(想想定义)。

    在运行时,您可以避免链接库,而是动态加载它。代码应处理定位/加载库的失败并回退到替代版本。

    【讨论】:

    • 我不认为 prep 宏在代码中会有用,因为库是预编译的,它应该支持这两种情况......
    • 好吧,我已经研究过动态加载库,这似乎解决了问题......但代价是必须手动导出我需要使用的所有符号(至少在使用 dlopen 时) )。你知道……更友好的方法吗?
    • AFAIK gcc 默认导出所有符号,您是否使用-fvisibility=hidden 命令行标志?根据库是什么,编写一个简单的包装器并导出该包装器可能是值得的。这也将具有在库不存在的情况下允许简单替换的优点(通过具有类似的 wrapper 来实现不同版本的功能)
    猜你喜欢
    • 2011-11-27
    • 2014-12-10
    • 2015-08-04
    • 2017-07-12
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    相关资源
    最近更新 更多