构建C动态共享库出现未定义符号错误

3
为什么构建静态库(.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:
1个回答

0

你的库代码确实引用了"_float_cmp_func",但需要在运行时找到它。

但是静态库并不是预期的足够的二进制模块,它只是一组目标代码,旨在与其他目标代码和库一起包含在后续的构建/链接步骤中。

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


问题中的错误是OSX的问题 - 默认情况下,您无法创建具有未绑定引用的dylib / so(在Linux中允许这样做)。 - Anya Shenanigans
感谢 @Petesh 的澄清 :) - mvidelgauz
如果我理解正确,这意味着当我有多个项目即互相依赖的输出库时。使用静态库时,我将每个项目归档成.a文件,然后使用这些(例如10个)库的最终项目必须链接到这些库。但是,当我使用.so文件时,最终项目可以链接到某个具有对其他库的依赖关系的库,而这些库又有对其他库的依赖关系,即对于静态库,编译每个项目时都需要重复链接相同的库,而使用共享库则不需要。 - Michał Ziobro
1
是的,.a 文件只包含适用于该库的代码,并且不能说明它依赖于其他东西 - 例如另一个 .a 中的代码。当您构建 .so 时,可以将其链接到依赖于另一个库,因此用户只需要链接到父 .so 文件,而不需要链接到所有其他 .so 文件。例如,gcc -shared -fPIC -o libb.so -L. -la 将使 libb.so 在运行时也依赖于 liba.so - Anya Shenanigans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接