Qt release版 resource 文件中js自動被編譯

QJSEngine

QJsengine是代替QScriptEngine的新的js引擎。

release

release版本軟件是區別於debug版本的。

問題

今天在resource文件中讀取js文件,用QJsengine加載,代碼如下。
.cpp文件

QJSEngine jsengine;
    jsengine.installExtensions(QJSEngine::AllExtensions);
    QString fileName = ":/test.js";
    QFile scriptFile(fileName);
    qDebug()<<QFileInfo(scriptFile).absoluteFilePath();
    if (!scriptFile.open(QIODevice::ReadOnly)){
        QMessageBox::information(nullptr, "Title", "文件打開失敗",
                                 QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
        return ;
    }
    QTextStream stream(&scriptFile);
    QString contents = stream.readAll();
    scriptFile.close();
    QJSValue result = jsengine.evaluate(contents, fileName);
    if (result.isError())
        qDebug()
                << "Uncaught exception at line"
                << result.property("lineNumber").toInt()
                << ":" << result.toString();
    qDebug()<<"end";

.js文件

console.log("hello!");

debug版本運行正常,但切換到release後發現無法執行。

查找原因

打印讀出的js文件內容

打印讀出的js文件,發現沒有,是空的。

    QTextStream stream(&scriptFile);
    QString contents = stream.readAll();
    scriptFile.close();
    qDebug()<<contents;
    QJSValue result = jsengine.evaluate(contents, fileName);

什麼,用了幾百遍的代碼,居然出錯了,文件打開了,卻沒有讀取出來?一萬個爲什麼飄過。

查看資源文件內容

<RCC>
    <qresource prefix="/">
        <file>test.js</file>
    </qresource>
</RCC>

刪除user文件,重新構建

刪除.pro.user文件,重新構建代碼,debug正常,release版本還是不行。
比較兩個的obj,moc等文件,發現了一些問題。
debug版本是這樣的

    moc_mainwindow.cpp
    moc_mainwindow.o
    moc_predefs.h
    qrc_res.cpp
    qrc_res.o

release版本是這樣的

    moc_mainwindow.cpp
    moc_mainwindow.o
    moc_predefs.h
    qmlcache_loader.cpp
    qmlcache_loader.o
    test_js.cpp
    test_js.o

test_js.cpp,這不是我的js文件嗎?怎麼成cpp了?好吧,暫時理解爲編譯器由於某種神奇的力量,將我的resource文件中的test.js文件編譯了,變成了.cpp文件,而沒有將它放在資源文件中,導致無法讀取出數據。

重命名嘗試

既然js文件被編譯,那其他文件不會被編譯吧?重命名test.js文件爲test.jst,重新加載,軟件正常。

總結

Qt release版resource 中js文件會被特殊編譯爲cpp文件,而不是資源文件的cpp文件,導致讀取資源文件內容時,無法讀取到數據,解決方法就是將js文件不要命名爲.js,用其他後綴代替。

ps:此問題所用的qt版本爲5.12.2,系統爲windows7,經嘗試,MinGW和msvc編譯器都是如此。也許在什麼地方將js優化爲cpp,但我並不知道。若有知道原因的大神,希望可以指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章