当前位置: 首页 > 科技观察

还记得一个花了半天时间才解决的bug,我的图标哪里去了?

时间:2023-03-21 17:04:51 科技观察

昨天遇到一个很奇怪的bug。事情是这样的。我用Qt写了一个动态库,这里叫lib。库中有多个接口。相应的,我也添加了一些图标。首先,我在Windows下使用QtMSVC编译器编译它。libA编译完成后,我通过另外一个程序(这里叫app)调用它,通过在app中调用lib的接口来显示lib中的接口,此时一切正常,界面、图标、功能都符合预期。然后我把上面两个工程复制到linux系统中,用Qtgcc编译。编译没有问题,运行的时候界面和功能都正常,就是所有的图标都不显示。这时候觉得问题不大,感觉马上就可以解决,于是先检查资源是否复制完整,然后执行qmake,然后rebuild。运行,问题依旧。还是不要慌,这时候我想弄清楚问题出在动态库lib还是应用程序app,所以我用Qt新建一个界面程序,添加库lib,包含头文件,然后调用接口,编译运行,图标显示正常,没有任何问题。因此确定问题出在应用程序上。然后查看了依赖库,imageformats文件夹是不是少了,没发现问题。所以开始检查代码。因为我在app里面是用qss设置样式的,根据我之前的经验,可能是样式表又出问题了。如果我注释掉样式表设置代码,编译运行后,问题依旧。检查代码后没有发现问题,于是开始重新整理思路。如果没有显示图标,要么是资源问题,要么是依赖问题。通过上面的检查过程,可以确定依赖没有问题,只能是资源问题。我所有的资源都添加到images.qrc中,我把images.qrc中的图片资源全部删除,然后重新添加。再次编译,问题依旧没有解决。大吃一惊,怎么会这样,我不信邪,打开上面刚刚创建的项目测试动态库是否正常,添加Qt资源文件,按照习惯命名为images,然后然后给它添加同样的图片,然后编译运行后,显示动态库中的界面,但是图标没有了。问题出现在这个images.qrc中,已经很接近真相了,心里还是有些小激动。那么images.qrc有什么问题呢?首先,image肯定不会影响程序,所以是images.qrc本身的原因。再看lib下的资源文件也叫images.qrc。是因为重名吗?app中的images.qrc改为app_images.qrc,重新编译运行,出现图标,问题解决。至于具体原因,在网上找不到确切的说法,但是因为只有linux下有问题,出现名字重复的时候,那么链接出错了多少次,具体原因我查明后会放在评论里。