如何防止 Qt/cmake 向 windows 上的资源添加回车符 returns

How to prevent Qt/cmake from adding carriage returns to resources on windows

我有一个在 Linux 上开发的 Qt 程序。其中包含一些从配置文件解析的用户设置。当然,用户在第一次启动时往往不会有那个配置文件,我们希望即使它不存在也能正常工作,所以合理默认值的副本存储在资源文本文件中,该文件位于与磁盘版本的格式相同。

运行 在 windows 上 运行 时感到很烦...

资源的 "\n" 行尾已全部转换为 "\r\n" 行尾!我真的宁愿不必更改解析器以选择性地接受不止一种类型的换行符。

有没有办法通过传递标志或类似的方式告诉 cmake 告诉 Qt 资源编译器不要进行转换?

编辑:为了阐明发生了什么,我将解释我认为 qrc 正在添加换行符的所有细节...

首先,我有一个 .qrc 文件,大致如下所示:

<RCC>
    <qresource prefix="/">
        <file>res/DefaultSettings.txt</file>
    </qresource>
</RCC>

它是通过 cmake 使用如下代码添加到可执行文件中的:

qt5_add_resources(QRC_SOURCES
    resource.qrc
)

add_executable(my_project
    resource.qrc
    main.cpp
)

最后,它正在加载这样的代码:

QByteArray loadResource(const QString &resource) {

    QResource res(resource);
    if(!res.isValid()) {
        qFatal("Failed to load internal resource");
    }

    // don't copy the data, if it's uncompressed, we can deal with it in place
    auto defaults = QByteArray::fromRawData(reinterpret_cast<const char *>(res.data()), res.size());

    if(res.isCompressed()) {
        defaults = qUncompress(defaults);
    }

    // NOTE: at this point, using a debugger, I observe 
    // "\r\n" newlines in the defaults byte array 
    return defaults;
}

如果 "resource" 文本文件是指通过 qrc 存储在可执行文件中的二进制资源,那么不会:qrc 永远不会更改文件 - 它不区分二进制和文本资源,它都是二进制的就它而言。不过,git 等版本控制系统可能会在 checkin/checkout 上执行此操作。您还可以使用转换行尾的 API 来读取文件。理想情况下,您希望有一个输出文件的复制器,然后是另一个使用 qrc 嵌入文件然后演示更改后的行结尾的复制器。