编译安装Grit

Grit是一款C语言编写的GBA/NDS图片格式转换软件,由Jasper Vijn (Cearn)开发。 Grit可以接受JPG、PNG等许多格式(只要受FreeImage支持),输出可以是C/asm数组也可以是原始二进制文件。总而言之就是非常强大,GBA/NDS homebrew必备。

环境

软件版本表
软件版本
GCC9.4.0
FreeImage3.18.0

下载

作者的个人网站上提供了Windows版的可执行文件。然鹅,我需要Linux版的(虽然是WSL)。幸好,作者慷慨地将源码也公布出来了,遵循MIT协议。

编译

初次尝试

源码中可以看到有Makefile,试着make一下?报错×3。

1
2
cldib/cldib_conv.cpp:182:10: error: cannot convert ‘bool’ to ‘CLDIB*’ in return
182 | return false;

怎么会有人在返回结构体指针的函数里返回false……无奈把所有的return false改成return NULL

安装依赖

再次make,提示无法链接libfreeimage,安装即可。

1
sudo apt install libfreeimage-dev

但是,还是无法链接freeimage库。

1
2
3
4
g++  -s -static -o grit build/grit_main.o build/cli.o build/fi.o  -L. -lgrit -lcldib -lfreeimage
/usr/bin/ld: cannot find -lfreeimage
collect2: error: ld returned 1 exit status
make: *** [Makefile:127: grit] Error 1

修复Makefile

这是为什么呢?这一切都怪-static

作者坚持仅在Linux平台上加上这个flag,意为链接静态链接库而不是动态库。正如Windows版二进制包里附带了freeimage.dll,或许他想要发行完全“portable”的软件。但是,为了编译,freeimage的头文件我都下了,不在乎便携性了。更何况apt安装的freeimage库只有动态链接库,想要静态链接自然是找不到。

于是在Makefile:40:19处把-static删掉再make,编译成功。

但是warning。

锦上添花(可选)

1
2
/usr/bin/ld: ./libgrit.a(grit_xp.o): in function `grit_xp_c(GritRec*)':
grit_xp.cpp:(.text+0x745): warning: the use of `tmpnam' is dangerous, better use `mkstemp'

全局搜索看到,作者留下了这样一段话:

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.

0条搜索结果。