2013-03-19 49 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用于某些特殊情况,如加载插件或启动可选功能。