【问题标题】:Linking two shared libraries together - undefined reference to symbol将两个共享库链接在一起 - 对符号的未定义引用
【发布时间】:2014-09-11 21:48:49
【问题描述】:

我有两个共享库 libA 和 libB,我想创建一个新的库 libC,它链接到这两个库,所以我可以用 -lC 而不是 -lA 和 -lB 链接我的应用程序。 我不能使用 -lA 和 -lB 之一,否则我必须修复许多包。

libB 是预编译的二进制文件。

我试图运行这个:

gcc -fPIC -shared -o libA.so A.c
gcc -shared -Wl,--no-as-needed -L. -lA -lB -o libC.so

但是当我链接我的应用程序时,需要 libB 和 -lC I

App.o: undefined reference to symbol 'SymbolInB'

note: 'SymbolInB' is defined in DSO libB.so 所以尝试将其添加到链接器命令行

libB.so: could not read symbols: Invalid operation

如果我运行 readelf -a libB.so,我在 .dynsym 中看到 SymbolInB,它在 libC.so 中丢失了。所以我假设我错过了正确解析符号的链接选项?

【问题讨论】:

    标签: c gcc linker ld symbols


    【解决方案1】:

    这样不行。 libC 中的函数可以使用libAlibB 中的函数,因为libC 与其他库链接。但是,libAlibB 中的那些符号不会从libC 中导出,因此如果您的应用程序直接使用libB 中的函数,则需要与libB 链接。

    【讨论】:

    • 感谢您的回复。所以我正在考虑为libB 中的每个函数编写包装函数(在libC 中)。这种方法行得通吗?
    • @user3860311 是的,它会起作用,但它比仅仅链接其他库更有效,并且会引入更多错误或问题的来源。例如,想一想如果libB 中的函数发生更改,但您忘记更改包装器会发生什么?
    • 是的,这就是为什么我想避免这样的包装。我试图实现的是:libB 是一个专有的 EGL 库,它缺少一些功能。 libA 实现了这些功能。 libC 包含两个库并重命名为 libB,因此任何应用程序都可以使用 libB + 缺少的函数。有没有其他方法可以做到这一点?
    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 2011-09-26
    • 2019-02-12
    • 1970-01-01
    • 2021-07-22
    • 2011-02-28
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多