Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linux、Mono、共享库和未解析符号_C#_Linux_Mono_Shared Libraries - Fatal编程技术网

C# Linux、Mono、共享库和未解析符号

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

我有一个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#驱动程序:

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

/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