在Windows中,我在Qt下有一个CMake构建,它通过find_library命令定位一个A.lib文件,该文件位于与A.dll文件相对的单独目录中,然后使用target_link_libraries命令链接该A.lib文件。
就构建而言,CMake在运行时之前不定义.lib文件中的符号是没有问题的。
在运行时,我使用windeployqt成功地将所有依赖库(包括A.dll文件)从build目录组装到一个单独的deploy目录中,并且能够很好地在那里运行。
然而,要通过Qt的调试器运行,Qt会从build文件夹而不是deploy文件夹运行可执行文件。默认情况下,Qt会尝试将build库文件夹添加到PATH变量中。令人钦佩的是,它还尝试扫描依赖项,如Qt库和A.lib的路径,并将它们添加到PATH中。不幸的是,它不会添加A.dll的路径。从而导致启动线程中的失败DLL依赖性错误。
我可以通过在Qt的“项目”选项卡的“运行”部分中将A.dll的路径添加到PATH中来轻松地解决这个问题。然而,我很好奇,是否可以让Qt通过一些CMake命令捕获这个依赖项,并自动将A.dll添加到PATH中,就像它正确捕获其他依赖项一样?我不确定Qt是如何尝试找到依赖项的,但在以前的QMake构建迭代中,自动附加到A.dll的路径。
1条答案
按热度按时间c0vxltue1#
从Qt 7.0.1开始,Qt添加了一个变通方案,允许用户通过target_link_directories命令将dll路径添加到Cmake,并让Qt从Cmake文件-api中解析这些路径,以添加到Windows中的PATH变量中。
此修复在Qt Creator 7.0.1中,请参阅此处的更改摘要:
https://codereview.qt-project.org/c/qt-creator/qt-creator/+/404290
在Qt官方网站上(我应该先去看看),促使这一变化的问题是:
https://bugreports.qt.io/browse/QTCREATORBUG-27201?workflowName=Qt+Bug+Tracking+v2.4&stepId=8
应该注意的是,这个问题的解决方案在早些时候(我不确定具体是什么时候)被添加到Qt Creator中,在\lib文件夹上的一个目录中查找\bin文件夹(参见实现这个解决方案的代码,并在这里执行CMake文件-api查询)。
后一种解决方法碰巧不适用于我的特定MSVC构建的库文件夹,因为lib和bin文件夹本身位于包含体系结构和操作系统信息的文件夹中,上面分别有一个公共父文件夹。
将Qt Creator更新到7.0.1并使用target_link_directories命令可解决此问题。