使用dlopen()加载共享库(.so)并在可执行文件中包含共享库有什么区别?

时间:2013-03-19 14:20:17

标签: c shared-libraries dlopen

有什么区别:

  1. 使用dlfcn.h中提供的dlopen()加载共享库
  2. 在构建可执行文件时在Android.mk文件中包含共享库。
  3. 代码示例: 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 个答案:

答案 0 :(得分:2)

使用dlopen(),链接器永远不会为您工作。在使用dlsym()进行调用之前,您必须手动查找每个函数。这使得来自共享对象的函数的每个调用站点比仅执行普通调用并让链接器对其进行排序更复杂。

答案 1 :(得分:2)

使用方法2(链接器),如果缺少库,则整个程序不会启动。使用方法1(dlopen),您可以优雅地处理错误,让程序保持运行。 dlopen用于某些特殊情况,例如加载插件或启动可选功能。