2017-06-06 54 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文件時,最終項目可能會鏈接到某個依賴於其他庫的庫,這些庫對其他庫具有依賴關係,即,使用靜態庫來編譯每個項目,我需要重複鏈接相同的庫,並且在使用共享庫不是 –