【问题标题】:Embed static library in dynamic library clang在动态库clang中嵌入静态库
【发布时间】:2022-07-29 15:47:32
【问题描述】:

我有一个项目,其中包含一个共享库(引擎)和一个可执行文件(游戏)。尽管如此,我的引擎正在使用其他一些库,如 spdlog。我想知道是否有办法仅将我的共享库与所有其他库链接。

目前,如果我在 Engine 中使用 spdlog(例如创建一个 Log 类),然后在游戏中使用这个 Log 类。我还需要在游戏中链接spdlog。

所以我想知道是否有一种方法可以将这些库“嵌入”到我的共享库中以避免所有这些链接到我的 exe 中?

顺便说一句,我在多个平台上使用clang,目前是windows和linux。

【问题讨论】:

  • 共享/动态库是一个单独的链接实体,很像可执行程序。但是,作为一个单独的实体,与使用该库的可执行文件不同,它的依赖项(共享库链接的库)不会从共享库中导出。如果您需要在自己的共享库和可执行文件中使用第三方库,则需要将该第三方库链接到可执行文件和共享库。
  • 也就是说,如果第三方库也是共享库,那么操作系统无论如何只会加载一次。它可能被映射到多个进程,但共享库的一份副本应该在内存中。
  • 目前它是一个我想“嵌入”的静态库。但这更多是出于实际原因,它并不妨碍我编码。我要求这样更容易使用。

标签: c++ linker clang shared-libraries static-libraries


【解决方案1】:

只有当 libspdlog 与 -fPIC 链接时才有可能(这不太可能)。在这种情况下,您可以在链接库时添加 spdlog:

gcc -o libmylib.so ... -Wl,--whole-archive path/to/libspdlog.a -Wl,--no-while-archive

如果在没有-fPIC 的情况下链接库,您将收到类似“重定位...无法在创建共享对象时使用;使用 -fPIС 重新编译”这样的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 2021-09-13
    • 2011-11-05
    • 1970-01-01
    • 2011-09-12
    • 2013-03-30
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多