C# Linux、Mono、共享库和未解析符号
我有一个shim库(shared,C++),它调用另一个共享库(libexif)中的函数,并为C#提供一个简单的接口,用于平台调用。(也就是说,一个C#程序使用PInvoke调用我的自定义共享库,而自定义共享库又调用另一个共享库。) 在Windows中,我的自定义共享库链接到共享库当我的自定义库链接和C#应用程序执行时,所有符号都被解析 在Linux上,链接我的共享库不会链接其他共享库。用C++驱动程序,当应用程序链接时,我指定另一个库,在那时,所有符号都被解析。但是,当我试图从C#程序(使用mono编译)调用我的共享库时,另一个共享库中的符号不会被解析。我尝试使用MONO_PATH变量指定另一个库,但似乎没有什么不同。我还尝试在DLLimport语句中指定未解析的函数,但这似乎也没有帮助 如何指定一个不被C#代码直接调用的共享库,以便mono/cli在运行时找到它 我使用以下命令构建共享库:C# Linux、Mono、共享库和未解析符号,c#,linux,mono,shared-libraries,C#,Linux,Mono,Shared Libraries,我有一个shim库(shared,C++),它调用另一个共享库(libexif)中的函数,并为C#提供一个简单的接口,用于平台调用。(也就是说,一个C#程序使用PInvoke调用我的自定义共享库,而自定义共享库又调用另一个共享库。) 在Windows中,我的自定义共享库链接到共享库当我的自定义库链接和C#应用程序执行时,所有符号都被解析 在Linux上,链接我的共享库不会链接其他共享库。用C++驱动程序,当应用程序链接时,我指定另一个库,在那时,所有符号都被解析。但是,当我试图从C#程序(使用m
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#驱动程序:
执行时,我收到一个错误,即找不到共享库使用的符号:
/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之间的垫片。)
我还没有弄明白如何解决这个问题。如有任何建议,将不胜感激
编辑:回答问题:
您确定非托管
libexif包装器可以在
LD_库_路径环境变量
事实并非如此。我在DLLImport中创建了直接指向它的路径。运行时会找到它,因为它会在上面的错误消息中报告指向它的路径。此外,缺少的符号不是由C#程序调用的,而是我共享库中的一个函数调用了随后未找到的函数。(谢谢-汉克)我不明白你为什么需要
-lc
,但也许这是一个单声道的奇怪现象
如果将-lexif
添加到link命令中,它是否有效?看起来您正在使用未定义的符号创建一个共享库,但没有说明这些符号应该来自何处。这实际上有时很有用——比如说,创建一个插件,使用加载它的应用程序已经提供的符号——但不是您想要的;我不知道libdl
(或者不管Mono如何加载库,也许它有自己的实现)如何知道它需要加载libexif.so
,以便在库中使用
希望您不必做像添加libexif这样可怕的事情。因此到存档…在链接包装器库时,您应该指定依赖项,如
g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc -lexif
当您这样做时,动态链接器知道libexif包装依赖于libexif,并且它可以解析加载的符号。是的,谢谢。为我的垫片库添加-lexif-to-link命令可以解决这个问题。结果表明,不需要-lc。这是我复制的一个例子的一部分(我盲目地复制了它)消除它似乎没有困难,无论是我的C++测试应用程序,也不适用于我的C测试应用程序。今天我用代码测试了你的解决方案::块16.11,我仍然得到运行时错误/Ur/bin /Muno:符号查找错误:/HOME/VANKAT/DealthXX64/StAMCAMXIIHyBuffLinux /Debug /LbDATABRIVLILB64.SO:未定义符号:_Z15ciIPC_OpenMutexPKc
g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc -lexif