2013-03-19 48 views
2

之間有什麼區別:在dlfcn.h中 使用dlopen()加載共享庫(.so)並在可執行文件中包含共享庫之間有什麼不同?

    1. 使用dlopen加載一個共享庫()可用的,包括在構建中的可執行文件Android.mk共享庫。

    代碼例如: Android.mk文件:

    LOCAL_PATH:= $(call my-dir) 
    include $(CLEAR_VARS) 
    LOCAL_SRC_FILES:=  \ 
        test.c 
    
    LOCAL_SHARED_LIBRARIES := \ libtest 
    
    LOCAL_MODULE:= test 
    LOCAL_MODULE_TAGS := eng 
    LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES) 
    
    include $(BUILD_EXECUTABLE) 
    

    在執行上述2種方法,這是實現的更好/更有效的方式?

  • 回答

    2

    dlopen(),鏈接器從來沒有爲你工作。您必須手動查找每個功能,然後使用dlsym()進行調用。這使得每個來自共享對象的函數的調用站點比僅僅進行普通調用並讓鏈接器對其進行排序更爲複雜。

    +0

    您可以提供一個函數查找的例子嗎? – sudhir 2013-04-03 08:46:52

    2

    使用方法2(鏈接器),如果缺少庫,則整個程序無法啓動。使用方法1(dlopen),可以優雅地處理錯誤,使程序繼續運行。 dlopen用於某些特殊情況,如加載插件或啓動可選功能。