编译安装Grit
Grit是一款C语言编写的GBA/NDS图片格式转换软件,由Jasper Vijn (Cearn)开发。 Grit可以接受JPG、PNG等许多格式(只要受FreeImage支持),输出可以是C/asm数组也可以是原始二进制文件。总而言之就是非常强大,GBA/NDS homebrew必备。
环境
| 软件 | 版本 |
|---|---|
| GCC | 9.4.0 |
| FreeImage | 3.18.0 |
下载
作者的个人网站上提供了Windows版的可执行文件。然鹅,我需要Linux版的(虽然是WSL)。幸好,作者慷慨地将源码也公布出来了,遵循MIT协议。
编译
初次尝试
源码中可以看到有Makefile,试着make一下?报错×3。
1 | cldib/cldib_conv.cpp:182:10: error: cannot convert ‘bool’ to ‘CLDIB*’ in return |
怎么会有人在返回结构体指针的函数里返回false……无奈把所有的return false改成return NULL。
安装依赖
再次make,提示无法链接libfreeimage,安装即可。
1 | sudo apt install libfreeimage-dev |
但是,还是无法链接freeimage库。
1 | g++ -s -static -o grit build/grit_main.o build/cli.o build/fi.o -L. -lgrit -lcldib -lfreeimage |
修复Makefile
这是为什么呢?这一切都怪-static。
作者坚持仅在Linux平台上加上这个flag,意为链接静态链接库而不是动态库。正如Windows版二进制包里附带了freeimage.dll,或许他想要发行完全“portable”的软件。但是,为了编译,freeimage的头文件我都下了,不在乎便携性了。更何况apt安装的freeimage库只有动态链接库,想要静态链接自然是找不到。
于是在Makefile:40:19处把-static删掉再make,编译成功。
但是warning。
锦上添花(可选)
1 | /usr/bin/ld: ./libgrit.a(grit_xp.o): in function `grit_xp_c(GritRec*)': |
全局搜索看到,作者留下了这样一段话:
Also, I’m using tmpnam(), which apparently isn’t recommended due to safety, but I don’t know a suitable, portable alternative.
Google一下”Windows mkstemp”得知,Windows确实没有这个函数的实现。但反正现在我只想编译Linux版的二进制文件,直接全部替换掉。然后把编译完名为grit的文件拖进$PATH的某个路径里。
All done.