2017-06-06 127 views
3

为什么要建造静态库(.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: 

回答

0

库的代码确实提到“_float_cmp_func”,这需要在运行时被发现。

但静态库预计不会有足够的二进制模块,它只是被设计成纳入以后的版本/链接步骤(与其他目标代码和库一起)目标代码的集合。

相反,共享库是“现成使用”二进制模块,所以它的依赖性应在链接阶段得到解决。因此,在这种情况下,你应该添加到您的链接步骤中的一些模块(一个或多个),其中“_float_cmp_func”实施

+0

有问题的错误是一个OSX的事 - 你不能创建一个dylib /以便在默认情况下未绑定引用(你可以在linux中执行此操作)。 – Petesh

+0

谢谢@Petesh澄清:) – mvidelgauz

+0

如果我理解正确这意味着,当我有几个项目,即输出库依赖于对方。与使用静态库相比,我将每个项目归档到.a文件中,然后使用这几个库(例如10个库)的最终项目必须链接到此(例如10)库。但是当我使用.so文件时,最终项目可能会链接到某个依赖于其他库的库,这些库对其他库具有依赖关系,即,使用静态库来编译每个项目,我需要重复链接相同的库,并且在使用共享库不是 –