首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux,Mono,共享库和未解决的符号

Linux,Mono,共享库和未解决的符号
EN

Stack Overflow用户
提问于 2009-04-02 19:53:32
回答 2查看 3.1K关注 0票数 2

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

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

在Linux上,链接我的共享库并不链接其他共享库。使用C++驱动程序,当应用程序被链接时,我指定了另一个库,并且在那时,所有的符号都被解析。但是,当我试图从C#程序调用共享库(使用mono编译)时,其他共享库中的符号无法解析。我尝试过使用MONO_PATH变量来指定另一个库,但这似乎没有什么区别。我还尝试在DLLimport语句中指定未解决的函数,但这似乎也没有帮助。

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

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

代码语言:javascript
复制
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#驱动程序:

代码语言:javascript
复制
mcs -unsafe -define:LINUX Test-libexif-wrapper.cs

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

代码语言:javascript
复制
/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#程序调用的,而是由共享库中的一个函数调用的。(谢谢-汉克)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-02 22:08:11

在链接包装库时,应指定依赖项,如下所示

代码语言:javascript
复制
g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc -lexif

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

票数 4
EN

Stack Overflow用户

发布于 2009-04-02 22:07:43

我搞不懂你为什么需要-lc,但也许这是个莫诺怪事.

如果将-lexif添加到链接命令中,会起作用吗?似乎您正在创建一个具有未定义符号的共享库,但没有说明这些符号来自何处。这有时确实很有用--比如说,创建一个插件,使用应用程序加载它时预期已经提供的符号--但这不是您想要的;我不认为libdl (或者Mono加载库,也许它有自己的实现)会知道它需要加载libexif.so才能在库中使用。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/711333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档