Linux,单声道,共享库和未解决的符号

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

在Windows中,当自定义库链接并执行C#应用程序时,我的自定义共享库链接到共享库,所有符号都已parsing。

在Linux上,链接我的共享库不会链接其他共享库。 使用C ++驱动程序时,我指定应用程序链接时的其他库,并在那个时候解决所有符号。 但是,当我尝试从另一个共享库中的C#程序(使用单声道编译)符号调用我的共享库时,则无法parsing。 我试过使用MONO_PATHvariables来指定其他库,但它似乎没有区别。 我也尝试在DLLimport语句中指定未parsing的函数,但似乎没有帮助。

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

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

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 

在执行时,我得到一个错误,我的共享库使用的符号没有find:

 /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之间的一个垫片。)

我一直无法弄清楚如何解决这个问题。 任何build议,将不胜感激。

编辑:要回答这个问题:

你确定可以在LD_LIBRARY_PATH环境variables中find非托pipe的libexif-wrapper吗?

事实上并非如此。 我已经制作了DLLImport中的path,直接指向它。 运行时find它,因为它在上面的错误消息中报告它的path。 此外,缺less的符号不是由C#程序调用的,而是我的共享库中的一个函数调用的函数,然后找不到。 (谢谢 – 汉克)

Solutions Collecting From Web of "Linux,单声道,共享库和未解决的符号"

当你像链接包装器库时,你应该指定依赖关系

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

当你这样做的时候,动态连接器知道libexif-wrapper依赖于libexif,它可以在加载时解析符号。

我很困惑你为什么需要-lc ,但也许这是一个单调的怪异…

如果您将-lexif添加到链接命令,它工作吗? 看来你正在用未定义的符号创建一个共享库,但并不是说这些符号应该来自哪里 。 这实际上有时是有用的 – 比方说,创建一个插件,使用一个符号,预期已经由加载应用程序提供 – 但不是你想要的东西; 我不知道如何libdl (或者单声道加载库,也许它有自己的实现)会知道它需要加载libexif.so用于您的库。

希望你不必做一些可怕的事情,比如把libexif.so加到档案中。