lemon算是一个非常好用的评测软件吧。最近又有了评测代码的需求,而之前使用lemon都是在Windows下,自己的Mac并没有装双系统,于是就想着有没有办法在在Mac上使用。

好在lemon是基于Qt的开源软件,而Qt本身是跨平台的,可以说希望是相当大的。一番操作之后,总算搞定了。

参考资料: https://blog.csdn.net/huzecong/article/details/9422843

第零步:安装Qt

想必大家安装的是比较新的Qt5吧。在安装Qt之后,找到qmake,把它加入$PATH。

第一步:下载lemon的源码

https://github.com/Sojiv/Project_lemon
直接git clone即可。

第二步:更改环境

1.将所有Q_OS_LINUX改为Q_OS_MAC

2.重新编译watcher_unix

gcc watcher_unix.c -o watcher_unix

第三步:将代码迁移到Qt5

1.在lemon.pro内加入以下两句话

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

这时候qmake lemon.pro应该就可以通过了。

2.修改头文件&更新函数参数

命令行make,之后会报各种错。

1.报出QtGui/QWidget或者QtGui/QApplication找不到,解决方法是把QtGui删掉,直接#include<QApplication>#include<QWidget>

2.报出某个类incomlete或者undefined,解决方法是在头文件里补充include一些内容。命名都很规律所以也不用怎么查,哪个类不行就包含哪个。

E.g.

#include<QMessageBox>
#include<QPushButton>
#include<QFileDialog>
...

还有可能报出一些奇妙的错误,解决方法也是加头文件

3.报出没有setResizeMode函数,改为setSectionResizeMode即可。

4.报出...::UTF8这个东西没有定义,但Qt5已经默认UTF8了,所以直接删掉这个参数即可。

5.报出没有toAscii函数,改成toLatin1即可。

6.报出有个构造函数中Type类型没有定义,这个在Qt5中被deprecated了,直接注释掉对应的构造函数(声明和实现)即可。

第四步:修复内存消耗的错误

这时候应该就得到了一个lemon了,可以打开试试。不知道什么原因,在我的机子上并不能打开以前Windows上留下的cdf文件,会秒退。但是新建的可以正常使用,之前的重新开一个就行了,所以也不影响。

但是很快发现了问题,就是内存消耗非常奇怪,动不动爆个负数出来,肯定有问题。

关于评测的代码在judgingthread.cpp里面,具体的监视活动则是包给了watcher_unix。一番调查之后发现了问题所在:watcher_unix会开一个线程监视它使用的内存,具体的内存应该是rusage结构体中的ru_maxrss这个值。这个值的单位貌似是没有严格规定的,在某个linux的标准中规定是kB,但实际测试发现是B,可能是Mac下不一样?于是将watcher_unix.c中ru_maxrss后跟着的*1024给删掉,重新编译,这样就能得到正常的内存了。

然而这时的lemon还是不能正常报内存超限,明明内存比限制大,依旧显示答案正确。仔细检查之后,发现代码里只判断了线程被kill或者Terminate时候是内存超限,但是并没有加上资源使用的限制。内存超限的code是4,一个解决方法是将judgeingthread.cpp中if(code == 4)那个部分更改为:

if (code == 4 || memoryUsed > 1LL * memoryLimit * 1024 * 1024) {
    delete runner;
    score = 0;
    result = MemoryLimitExceeded;
    if (code == 4) memoryUsed = -1;
    return;
}

这样就可以了,还能在超限的时候显示使用了多少内存。

第五步:更改图标

重新编译的lemon应该算是可以用了,但图标不对,没有灵魂。改图标很简单,按照这里所说的做就行了。

在MacOS下使用lemon评测

就是在Mac下的风格比较奇怪。

我的系统版本是macOS10.15 Catalina, Qt版本是比较早的Qt5.12.5。

分类:

技术点:

相关文章: