我有一个shim库( shared,C++),它调用另一个共享库(libexif)中的函数,并为平台调用提供了一个C#的简单接口。(也就是说,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包装器是我的共享库,它充当C#应用程序和libexif之间的垫片。)
我一直想不出如何解决这个问题。如有任何建议,将不胜感激。
编辑:回答以下问题:
确实可以在LD_LIBRARY_PATH环境变量中找到非托管libexif包装器吗?
事实上,事实并非如此。我已经在DLLImport中构建了直接指向它的路径。运行时会找到它,因为它在上面的错误消息中报告了它的路径。此外,缺少的符号不是由C#程序调用的,而是由共享库中的一个函数调用的。(谢谢-汉克)
发布于 2009-04-02 22:08:11
在链接包装库时,应指定依赖项,如下所示
g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc -lexif当您这样做时,动态链接器知道libexif包装依赖于libexif,并且它可以解析加载中的符号。
发布于 2009-04-02 22:07:43
我搞不懂你为什么需要-lc,但也许这是个莫诺怪事.
如果将-lexif添加到链接命令中,会起作用吗?似乎您正在创建一个具有未定义符号的共享库,但没有说明这些符号来自何处。这有时确实很有用--比如说,创建一个插件,使用应用程序加载它时预期已经提供的符号--但这不是您想要的;我不认为libdl (或者Mono加载库,也许它有自己的实现)会知道它需要加载libexif.so才能在库中使用。
希望你不必做一些可怕的事情,比如把libexif.so添加到档案中.
https://stackoverflow.com/questions/711333
复制相似问题