【问题标题】:What is diiference between shared library (.so) loading using dlopen() and including the shared library in executable?使用 dlopen() 加载共享库 (.so) 和在可执行文件中包含共享库有什么区别?
【发布时间】:2013-03-19 14:20:16
【问题描述】:

有什么区别:

  1. 使用 dlfcn.h 中提供的 dlopen() 加载共享库
  2. 在构建可执行文件时将共享库包含在 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)

在执行上述两种方法时,哪种方法更好/更有效?

【问题讨论】:

    标签: c shared-libraries dlopen


    【解决方案1】:

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

    【讨论】:

    • 你能提供一个函数查找的例子吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 1970-01-01
      • 2016-08-02
      • 2015-03-02
      • 2018-07-15
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多