如何防止 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 嵌入文件然后演示更改后的行结尾的复制器。
我有一个在 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 嵌入文件然后演示更改后的行结尾的复制器。