WxWidget Windows应用添加资源项时‘找不到图片’错误的其他解决办法
WxWidget Windows应用资源文件路径问题
在WxWidget Windows应用中添加资源项时,资源文件仅被记录文件路径,导致程序运行时提示“找不到图片”错误。目前只能通过将文件手动复制到项目目录才能正常运行,请问有没有其他替代方案?
相关读取文件的代码如下:
void loadContacts(const string& filename, vector<Contact>& contacts) { ifstream file(filename); if (!file.is_open()) { wxMessageBox("Failed to open file"); return; } //跳过header line string line; getline(file, line); while (getline(file, line)) //将每一行的数据读入line中 { stringstream ss(line);//这里将string转换为stringstream流,便于数据读入 string temp; Contact contact; //每个循环创建一个contact getline(ss, temp, ','); contact.Name = temp; //重复操作 getline(ss, temp, ','); contact.PhoneNumber = temp; getline(ss, temp, ','); contact.Address = temp; getline(ss, temp, ','); contact.Birthday = temp; getline(ss, temp, ','); contact.Relationship = temp; //最后将contact加入到容器当中 contacts.push_back(contact); } }
替代方案
自动复制资源到输出目录:
若使用Visual Studio,右键资源文件→属性→常规,将“复制到输出目录”设为“如果较新则复制”或“始终复制”。编译时文件会自动同步到exe所在的Debug/Release文件夹,程序运行时即可正确寻址。若用CMake构建,可通过file(COPY ${RESOURCE_PATH} DESTINATION ${CMAKE_BINARY_DIR})指令实现自动复制。嵌入资源到程序二进制文件:
将资源打包进exe,无需额外携带独立文件。操作步骤:- 创建
.rc资源脚本,添加条目:MY_CONTACTS RCDATA "你的资源文件路径" - 修改代码用WxWidgets资源接口读取:
void loadContacts(vector<Contact>& contacts) { wxMemoryInputStream resStream(wxGetResource("MY_CONTACTS")); if (!resStream.IsOk()) { wxMessageBox("Failed to load embedded resource"); return; } wxTextInputStream textStream(resStream); // 跳过表头 textStream.ReadLine(); wxString line; while ((line = textStream.ReadLine()).IsEmpty() == false) { wxStringTokenizer tokenizer(line, ","); Contact contact; contact.Name = tokenizer.NextToken().ToStdString(); contact.PhoneNumber = tokenizer.NextToken().ToStdString(); contact.Address = tokenizer.NextToken().ToStdString(); contact.Birthday = tokenizer.NextToken().ToStdString(); contact.Relationship = tokenizer.NextToken().ToStdString(); contacts.push_back(contact); } }
- 创建
基于程序运行目录构造相对路径:
先获取exe的运行目录,再拼接资源的相对路径,确保寻址正确:wxString exeDir = wxPathOnly(wxStandardPaths::Get().GetExecutablePath()); wxString resourcePath = exeDir + "/resources/contacts.csv"; loadContacts(resourcePath.ToStdString(), contacts);需提前在项目中创建
resources文件夹存放资源,并配置构建时将该文件夹复制到输出目录。
内容的提问来源于stack exchange,提问作者Mike Hua
相关产品推荐
相关产品推荐

