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應該算是可以用了,但圖標不對,沒有靈魂。改圖標很簡單,按照這里所說的做就行了。
就是在Mac下的風格比較奇怪。
我的系統版本是macOS10.15 Catalina, Qt版本是比較早的Qt5.12.5。