在QT中如果需要使用资源时,会用到一个qrc文件.qrc文件本质上是一个XML文件,里面描述了相应资源的位置。一般将需要引用的资源放到与main.cpp同级的目录。我用VS2012开发QT,如果按正常的情况来建立QT,会带有一个qrc文件和对就的qrc*.cpp的文件,如下图(qrcexample.qrc和qrc_qrcexample.cpp)。
其中qrc_qrcexample.cpp是自动生成的,是在qrc名字的前面加了一个qrc_的前缀。如果这样正常添加资源文件是没有问题的,但是我却误删了qrc_qrcexample.cpp文件。等到想用qrc来加载图片时,按着正常的操作,在qrcexample.qrc中加了相应的图片,可是编译之后,怎么引用路径都无法得到图片。这到底是怎么了?找了很多资料,说是可以用Q_INT_RESOURCE在main函数中强制加载qrc文件,可是却报错了。(附:Q_INT_RESOURCE的调用方式是,Q_INT_RESOURCE(qrc文件名),注意一定要是qrc文件名。)
一般来说,无法解析外部符号,是因为函数有定义却没有去实现。那这里的qInitResources_qrcexample(void)根本就没有定义过,又怎么可能去实现呢?那只有一种解释,该函数是由系统自动生成并实现了。现在系统生成了该函数的定义,却没有相应的实现。那怎么办?
于是网上查找资料,后面找到了一篇文章,说是系统会生成一个与qrc资源文件相对应的CPP(也就是前面误删的qrc_qrcexample.cpp)。既然误删了,那是不是可以再建一个相同的?结果证明,这种想法太天真了。因为只是建一个这样的文件,里面什么内容都没有,那不是形同虚设吗?
想着,这个文件既然是系统生成的,那必然会在系统中有所配置,可是在找遍了配置项后,都没有找到一个对应的。后面就想着,VS的工程文件中有对引用和编译信息的配置,会不是存在那里呢?如果存在了那里,那我又要如何才能分辨出哪个是呢?最后的办法就是找一个正常的来对比。立即新建一个项目test,自动生成了test.qrc和qrc_test.cpp,用UE打开test.vcxproj,是一个XML格式的文件,搜索qrc_test.cpp,果然有相应的配置信息。
<ClCompile Include="GeneratedFiles\qrc_test.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</PrecompiledHeader>
</ClCompile>
依样画葫芦,用UE打开QrcExample.vcxproj,然后找到相应的位置,添加上相应的节点内容,下图的红框部分就是添加的。