大厦C动态共享库给出了错误的符号
问题描述:
为什么要建造静态库(.a)中没有给出任何错误,并正常工作:大厦C动态共享库给出了错误的符号
$(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:
答
库的代码确实提到“_float_cmp_func”,这需要在运行时被发现。
但静态库预计不会有足够的二进制模块,它只是被设计成纳入以后的版本/链接步骤(与其他目标代码和库一起)目标代码的集合。
相反,共享库是“现成使用”二进制模块,所以它的依赖性应在链接阶段得到解决。因此,在这种情况下,你应该添加到您的链接步骤中的一些模块(一个或多个),其中“_float_cmp_func”实施
有问题的错误是一个OSX的事 - 你不能创建一个dylib /以便在默认情况下未绑定引用(你可以在linux中执行此操作)。 – Petesh
谢谢@Petesh澄清:) – mvidelgauz
如果我理解正确这意味着,当我有几个项目,即输出库依赖于对方。与使用静态库相比,我将每个项目归档到.a文件中,然后使用这几个库(例如10个库)的最终项目必须链接到此(例如10)库。但是当我使用.so文件时,最终项目可能会链接到某个依赖于其他库的库,这些库对其他库具有依赖关系,即,使用静态库来编译每个项目,我需要重复链接相同的库,并且在使用共享库不是 –