【问题标题】:Accessing .so libraries using dlopen() throws undefined symbol error使用 dlopen() 访问 .so 库会引发未定义符号错误
【发布时间】:2013-01-15 10:36:00
【问题描述】:

我正在尝试将相机库 .so 文件动态加载到 Linux 可执行文件中,以访问简单的相机功能。

我正在尝试这样做:

  if ( (newHandle = dlopen("./libCamera.so",RTLD_LAZY | RTLD_GLOBAL)) == NULL )
  {
     printf( "Could not open file : %s\n", dlerror() );   
     return 1;
  }

但是这失败了,我收到以下输出: “无法打开文件:libCamera.so:未定义符号:ZTVN10_cxxabiv117__class_type_infoE”

我如何找出它所依赖的符号?

【问题讨论】:

    标签: linux shared-libraries


    【解决方案1】:

    很可能,libCamera.so 使用在共享库中定义的符号,而不依赖该库。

    1. 找出罪魁祸首。获取一个链接到libCamera.so 的真正可执行文件(它可以工作)。使用ldd /path/to/executable 列出其依赖项。其中应该是一个定义了ZTVN10_cxxabiv117__class_type_infoE 的库(使用grep 来选择可能的候选人,nm -D 肯定是在库上)。该库不会ldd ./libCamera.so 显示的列表中。

    2. 解决问题。首先通过dlopen 加载在步骤1 中找到的库(也可以在此处使用RTLD_GLOBAL)。

    3. 如果其他符号有问题,请转到步骤 1。

    4. 如果新添加的库也有同样的问题,请转到步骤 1。

    5. 告诉图书馆作者请修复他们的链接。

    也可能发生ldd ./libCamera.so 中的先决条件之一被升级并丢失了符号定义(可能它是使用名称修改不同的编译器重新编译的)。那么你就不会在第 1 步中找到罪魁祸首了,没有解决办法,只能再次降级 something

    【讨论】:

      【解决方案2】:

      ldd 命令可用于显示共享库依赖项。

      ldd libCamera.so
      

      了解依赖关系后,可以使用nm 显示每个库中的符号。

      nm -DC libCamera.so
      

      【讨论】:

      • 我看到nm -DC libCamera.so 中列出了一个函数,但它仍然未定义。最后事实证明,在 .h 文件中,参数之一是 const & 在 .cpp 中不是 const 导致它未定义。
      【解决方案3】:

      我遇到了类似的问题。这与 .a 库有关,它应该链接到我的 .so 并静态链接到被遗漏的存档中。

      我通过(此处使用的 OP 对象名称)确定了这一点:

      nm mylibrary.so | grep ZTVN10_cxxabiv117__class_type_infoE
      0000ABC0 U ZTVN10_cxxabiv117__class_type_infoE
      

      U 这里的means that 符号是“未定义”。您可以使用--demangle 找到丢失对象的解构名称:

       $ nm --demangle mylibrary.so | grep 0000ABC0 
      0000ABC0 U abi::class_type_info(params...)
      

      (或类似的东西)这应该可以帮助您确定缺少哪个库。

      就我而言,即使在编译器行中包含库之后,我仍然遇到问题。最终,经过一番修改,我发现库文件 (.a) 必须位于其依赖对象 (.o) 文件之后,例如:

      g++ -Wl,-E -g -m32 ... -fPIC myobjects1.o myobjects2.o missing_library.a -shared -o mylibrary.so
      

      现在我得到了(不再是U):

       $ nm --demangle mylibrary.so | grep 0000ABC0 
      0000ABC0 T abi::class_type_info(params...)
      

      最重要的是,我不再收到错误消息了!

      【讨论】:

        【解决方案4】:

        在您的 libCamera.so 源代码中,您有未解析的外部符号。这意味着type_infoE 在您的源代码中没有定义,应该解决。

        【讨论】:

          猜你喜欢
          • 2012-10-10
          • 2010-10-03
          • 2021-03-08
          • 2018-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多