您的位置:首页 > 其它

Nim语言导入FreeImage模块失败could not import: FreeImage_Initialise

2015-11-06 23:28 435 查看
本来看到nim语言有个图像处理的wrapper的, 就是lib页面的 freeimage, 地址  https://github.com/barcharcraz/nim-FreeImage

实用nimble install freeimage 之后,  再下载上面的源码里的test和图片, 编译通过, 运行报错!

could not import: FreeImage_Initialise

真是百思不得其解, 后来我摸索不出来结果. 也就暂时搁置了. 知道看到nim的官方论坛上有人提起这个事情, http://forum.nim-lang.org/t/1721

才知道不是我一个人遇到这个问题.

问题的根源在于, windows的dll, 32位和64为的dll内部函数名字命名规则不一样, 32为的函数, 默认在函数的名字前加了一个下划线, 而64位的不加下划线.   这个wrapper作者用的是64位的, 因此没有问题, 但是32位的就有问题了. 

因此解决的方法很简单, 把FreeImage_Initialise 替换为 _FreeImage_Initialise@4 即可. 

问题来了, @符号是什么意思, 这个不管, 是win32的dll自动命名加的, 那么4是啥意思, 就是FreeImage_Initialise(参数), 这个函数的参数占用几个字节的意思.

然后, 剩下的问题就是, 逐个替换 freeimage.nim中的函数名字了.

这里, 我已经替换完了, 地址在  https://github.com/encorehu/nim-FreeImage

替换的方法是打开freeimage.dll, 然后搜索  FreeImage_Initialise, 就会发现, 在  FreeImage_Initialise的附近, 有很多的函数, 都是前面带下划线的, 后面带@符号和参数占用字节数的. 我开始手工替换了几十个, 后来发现太累了, 后来写了个脚本来替换.

脚本在这: http://blog.csdn.net/huyoo/article/details/49690457

然后覆盖C:\Documents and Settings\Administrator\.nimble\pkgs\nim-freeimage-0.1 下的freeimage.nim文件

再到BasicTest.nim所在目录, 删掉nimcache这个编译的cache目录, 然后重新编译 nim c BasicTest

再运行 basictest

得到结果了:

D:\DEV>basictest
ref 006f0168 --> [biSize = (invalid data!),
biWidth = 1280,
biHeight = 960,
biPlanes = 1,
biBitCount = 32,
biCompression = (invalid data!),
biSizeImage = (invalid data!),
biXPelsPerMeter = 2835,
biYPelsPerMeter = 2835,
biClrUsed = (invalid data!),
biClrImportant = (invalid data!)]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息