Qt release版 resource 文件中js自动被编译

文章目录

  • QJSEngine
  • release
  • 问题
  • 查找原因
    • 打印读出的js文件内容
    • 查看资源文件内容
    • 删除user文件,重新构建
    • 重命名尝试
  • 总结

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.jsfile>
    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,但我并不知道。若有知道原因的大神,希望可以指出。

你可能感兴趣的:(Qt学习)