【问题标题】:Building C dynamic shared library gives undefined symbol构建 C 动态共享库给出未定义的符号
【发布时间】:2017-06-06 10:29:35
【问题描述】:

为什么构建静态库 (.a) 不会出现任何错误并且可以正常工作:

$(LIBRARY): assertion.o
    $(AR) $(OUTPUT_STATIC_LIB_DIR)/$(LIBRARY) $(OUTPUT_DIR)/assertion.o

同时,在构建共享库(.so)时出现这样的错误:

$(SHARED_LIBRARY): assertion.o
    $(CC) $(CFLAGS) -shared -o $(OUTPUT_LIB_DIR)/$(SHARED_LIBRARY) $(OUTPUT_DIR)/assertion.o

错误信息:

Undefined symbols for architecture x86_64:
  "_float_cmp_func", referenced from:

【问题讨论】:

    标签: c gcc shared-libraries dynamic-library


    【解决方案1】:

    您的库的代码确实引用了“_float_cmp_func”,它需要在运行时找到。

    但静态库不应该是一个足够的二进制模块,它只是目标代码的集合,旨在包含在以后的构建/链接步骤中(与其他目标代码和库一起)。

    相比之下,共享库是“即用型”二进制模块,因此它的依赖关系应该在链接阶段解决。因此,在这种情况下,您应该在链接步骤中添加一些实现“_float_cmp_func”的模块

    【讨论】:

    • 有问题的错误是 OSX 的问题 - 您无法创建默认情况下具有未绑定引用的 dylib/so(您可以在 linux 中执行此操作)。
    • 谢谢@Petesh 的澄清:)
    • 如果我理解正确这意味着当我有多个项目时,即相互依赖的输出库。与使用静态库相比,我将每个项目归档到 .a 文件中,然后使用这几个库(例如 10 个库)的最终项目必须链接到这个(例如 10 个)库。但是,当我使用 .so 文件时,最终项目可能会链接到一些 1 个库,这些库对其他库具有依赖关系,这些库对其他库具有依赖关系,即使用静态库来编译每个项目我需要重复与同一个库的链接,并且在使用时共享库不是
    • 是的,.a 文件只包含适用于该库的代码,不能说它依赖于其他东西 - 例如另一个.a 中的代码。当您构建.so 时,您可以链接它以依赖另一个库,因此用户只需要链接到父.so 文件,而不是所有其他.so 文件。例如gcc -shared -fPIC -o libb.so -L. -la 将使 libb.so 在运行时也依赖于 liba.so
    猜你喜欢
    • 2018-04-14
    • 2016-07-29
    • 1970-01-01
    • 2012-04-07
    • 2015-10-11
    • 2011-02-28
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多