代码之家  ›  专栏  ›  技术社区  ›  HankB

Linux、Mono、共享libs和未解析符号

  •  2
  • HankB  · 技术社区  · 16 年前

    我有一个SIMM库(共享,C++),它调用另一个共享库中的函数(LIbExIF),并为平台调用调用提供了一个简单的接口。(也就是说,一个C程序使用pinvoke来调用我的自定义共享库,然后调用另一个共享库。)

    在Windows中,当我的自定义库链接时,我的自定义共享库链接到共享库;当C应用程序执行时,将解析所有符号。

    在Linux上,链接我的共享库不会链接到另一个共享库。在C++驱动程序中,当 应用 被链接,此时,所有符号都被解析。但是,当我试图从另一个共享库中的C程序(使用mono编译)符号调用共享库时,不会解决问题。我尝试使用mono-path变量来指定另一个库,但似乎没有什么不同。我还尝试在dllimport语句中指定未解析的函数,但这似乎也没有帮助。

    如何指定不由C代码直接调用的共享库,以便mono/cli在运行时找到它?

    我使用以下命令构建共享库:

    g++ -fPIC -g -c -Wall  libexif-wrapper.cpp
    g++ -shared -Wl,-soname,libexif-wrapper.so.1     -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc
    ar rcs libexif-wrapper.a libexif-wrapper.so.1
    

    以及以下命令行来编译我的C驱动程序:

    mcs -unsafe -define:LINUX Test-libexif-wrapper.cs
    

    执行时,我得到一个错误,即找不到共享库使用的符号:

    /usr/bin/cli: symbol lookup error: ../../../C/libexif-wrapper/libexif-wrapper/libexif-wrapper.so.1: undefined symbol: exif_data_new_from_file
    

    (libexif wrapper是我的共享库,它充当C应用程序和libexif之间的填充程序。)

    我还不知道如何解决这个问题。任何建议都将不胜感激。

    编辑:要回答问题:

    你确定非托管 libexif包装可在 ld_library_path环境变量?

    其实不是。我已经在dllimport中创建了路径来直接指向它。运行时找到它是因为它在上面的错误消息中报告了它的路径。此外,缺少的符号不是由C程序调用的,而是我共享库中的一个函数调用了随后找不到的函数。(谢谢-汉克)

    2 回复  |  直到 16 年前
        1
  •  3
  •   lothar    16 年前

    当您像这样链接包装库时,应该指定依赖项

    g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc -lexif
    

    当您这样做时,动态链接器知道libexif包装器依赖于libexif,并且它可以在加载时解析符号。

        2
  •  2
  •   ephemient    16 年前

    我不明白你为什么需要 -lc 但也许这是一个单一的怪事…

    如果你再加一点它能用吗 -lexif 链接命令?似乎您正在创建一个带有未定义符号的共享库,但没有说 哪里 这些符号应该来自。这实际上有时很有用——比如说,创建一个插件,它使用的符号应该已经由加载它的应用程序提供了——但不是您在这里想要的;我不知道如何 libdl (或者不管Mono如何加载库,也许它有自己的实现)会知道它需要加载 libexif.so 在你的图书馆里使用。

    希望你不必做像加法这样可怕的事情 因此, 到档案馆…