GDAL本身是C++编写的,通过DllImport / PINVOKE的方式封装为C#可以调用的类:
1)GdalPINVOKE中引入gdal_wrap.dll:
[DllImport("gdal_wrap", EntryPoint="CSharp_SetConfigOption")]
public static extern void SetConfigOption(string jarg1, string jarg2);
2) Gdal.cs中调用GdalPINVOKE
public static void SetConfigOption(string pszKey, string pszValue) {
GdalPINVOKE.SetConfigOption(pszKey, pszValue);
if (GdalPINVOKE.SWIGPendingException.Pending) throw GdalPINVOKE.SWIGPendingException.Retrieve();
}
3)实际使用中调用Gdal:
Environment.SetEnvironmentVariable("GEOTIFF_CSV", gdalData);
Gdal.SetConfigOption("GEOTIFF_CSV", gdalData);
现在,在windows 操作系统中,以上的过程可以正常调用;但是在Linux环境下调用的时候,提示无法加载gdal_wrap.dll,缺少dll或它的依赖项:
System.TypeInitializationException: The type initializer for 'OSGeo.GDAL.GdalPINVOKE' threw an exception. ---> System.TypeInitializationException: The type initializer for 'SWIGExceptionHelper' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'gdal_wrap': The specified module or one of its dependencies could not be found.
(Exception from HRESULT: 0x8007007E)
我尝试把可能依赖的dll都放到运行目录下,仍然无法正常调用。
请问,有没有高手碰到过类似的问题?
试试NuGet包:Gdal.Core
我装了一下Gdal.Core,调用的地方也改成调用Gdal.Core里的函数,但是还是提示无法加载gdal_wrap,找不到dll或它的依赖项:
直接把所有的so文件放到和编译的dll同样的路径也不行
@countryer: linux用的是哪个发行版?
@dudu: ubuntu 16.04 和 Centos 7两个
@dudu: 如果把路径改成错误的,会提示找不到文件:
Error:
An assembly specified in the application dependencies manifest (HHGIS.Core.deps.json) was not found:
package: 'Gdal.Core', version: '1.0.0'
path: 'publish/runtimes/runtimes/linux-x64/native/gdal_wrap.so'
感觉Gdal.Core好像有其他依赖的文件没有打包在一起似的
@countryer: 试试 apt install gdal-bin
安装 GDAL
@countryer: 试试将 gdal_wrap.dll
复制到 ~/.nuget/packages/gdal.core/1.0.0/lib/netstandard2.0
文件夹中
@dudu: 我把Gdal.Core里的dll和so文件放进去试了一下,还是提示gdal_wrap的错误
c++的dll在Linux是没法直接使用的. Linux下c++的动态库是so, 有源码切不依赖Windows的特性的话,可以将c++的源码用gcc编译为so,在调用
谢谢回复~
我换成GDAL.Core里带的SO文件试了一下,还是提示 :Unable to load DLL 'gdal_wrap': The specified module or one of its dependencies could not be found.
Linux环境下,SO文件需要放到什么特殊的位置吗?还是需要配置一下环境变量之类的才能指向这个文件?
@countryer: 在用gcc 加上 -fPIC 与位置无关 -shared 生成动态库 ,然后将动态库放到程序所在目录,pinvoke调用就好了
请问这个问题您解决了吗?我现在也遇到同样的问题。window下正常,linux下报错,跟您的错误一样的。
已解决,使用ldd gdal_wrap.so查看缺少哪些链接库,一一安装上就行了。
问题原因:在Linux中编译的过程中,由于系统本身的配置不同,编译的结果是不一样的,不同的系统编译的包不能通用,所以Nuget上的GDAL.Core是不能使用的。
– countryer 6年前解决方案:使用的时候,在系统中重新编译一下