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!)]
完
实用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!)]
完
相关文章推荐
- nim安装系统
- 博弈-Nim博弈
- USTCOJ 1213 取石子游戏 (经典NIM问题)及一些扩展 与(&) 或 (|)异或 (^)运算性质
- Codeforces Round #188 (Div. 1) Game with Powers 引发的联想 NIM游戏 Sprague Grundy Theory
- hdu1907
- uva10561(SG函数)
- SRM 624 D2L3: GameOfSegments, 博弈论,Sprague–Grundy theorem,Nimber
- POJ2975(nim输出走法总数)
- POJ2311
- POJ2425(树形,无向无环图博弈)
- POJ1704nim博弈变形
- HDU1404-sg
- HDU1536-nim
- BNU17047-nim博弈
- NIM(1)一排石头的游戏之扩展问题解法
- HDU 1850 Being a Good Boy in Spring Festival 基础Nim博弈
- HDU 2176 取(m堆)石子游戏 简单Nim游戏
- HDU_1850 Being a Good Boy in Spring Festival(Nim)
- HDU 1850 NIM游戏
- POJ1704 Georgia and Bob(Nim问题)