Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何部署qtc++;共享库&x27;在主可执行文件的子文件夹中是否有dll? 我有一个QT5 C++项目,它有一个主程序和一个共享库,由我创建。它编译并执行,我能够部署它。问题是,通过部署,我需要将已编译的共享库dll与主可执行文件放在同一目录中。但是,我建议保持顶层文件夹相对干净,并将必要的文件放在文件夹的适当子树中。所以,我的问题是:_C++_Qt_Dll_Deployment_Qt5 - Fatal编程技术网

如何部署qtc++;共享库&x27;在主可执行文件的子文件夹中是否有dll? 我有一个QT5 C++项目,它有一个主程序和一个共享库,由我创建。它编译并执行,我能够部署它。问题是,通过部署,我需要将已编译的共享库dll与主可执行文件放在同一目录中。但是,我建议保持顶层文件夹相对干净,并将必要的文件放在文件夹的适当子树中。所以,我的问题是:

如何部署qtc++;共享库&x27;在主可执行文件的子文件夹中是否有dll? 我有一个QT5 C++项目,它有一个主程序和一个共享库,由我创建。它编译并执行,我能够部署它。问题是,通过部署,我需要将已编译的共享库dll与主可执行文件放在同一目录中。但是,我建议保持顶层文件夹相对干净,并将必要的文件放在文件夹的适当子树中。所以,我的问题是:,c++,qt,dll,deployment,qt5,C++,Qt,Dll,Deployment,Qt5,要将dll的路径更改为myApp/myLib,其中myApp是主应用程序可执行文件所在的文件夹,我应该在*.pro文件中放置什么?因为Windows为您的程序搜索dll,而不是程序本身,您无法告诉makefile在哪里搜索库 但是,您可以: 将所需文件夹添加到dll的路径 制作一个启动脚本,设置库所在的路径,然后启动程序 如果您遵守LPGL或Qt Commercial许可证,则静态编译,具体取决于您的情况 作为旁注:Qt插件可以满足您的需求,但核心依赖项本身并不是Qt插件。是相当静态的。要包

要将
dll
的路径更改为
myApp/myLib
,其中
myApp
是主应用程序可执行文件所在的文件夹,我应该在
*.pro
文件中放置什么?

因为Windows为您的程序搜索dll,而不是程序本身,您无法告诉makefile在哪里搜索库

但是,您可以:

  • 将所需文件夹添加到dll的路径
  • 制作一个启动脚本,设置库所在的路径,然后启动程序
  • 如果您遵守LPGL或Qt Commercial许可证,则静态编译,具体取决于您的情况
作为旁注:Qt插件可以满足您的需求,但核心依赖项本身并不是Qt插件。

是相当静态的。要包含子目录,需要自定义DLL加载。有很多方法可以实现你想要的

  • 在应用程序启动期间延迟加载库(请参阅)和调整搜索路径。
    默认情况下,编译时动态链接库在进程初始化期间加载,然后再运行任何代码。链接器提供延迟加载DLL的选项,直到程序调用该DLL中的函数。这为您在应用程序启动期间提供了调整DLL搜索路径1的机会窗口(例如,通过调用)。
    注意:请记住,在运行任何用户代码之前都会初始化全局变量。如果全局的初始值设定项引用了延迟加载库中的符号,则在任何用户代码运行之前也会加载该库。这不是这些场景的解决方案
  • 使用自定义延迟加载帮助程序延迟加载库(请参阅和)。
    对于每次导入,系统都会调用helper函数。其中,helper函数负责加载模块。这允许实现任意复杂的库搜索。在这种特定情况下,可能最简单的方法是仅为库加载设置通知挂钩(请参阅)
还有其他的方法,看起来很有吸引力,但你不应该真的使用这些方法。以下是一份清单,包括不使用它们的理由:

  • 更改
    路径
    环境变量:虽然易于实现,但这是局部问题的全局解决方案。更改全局环境变量会影响整个系统。它可以被用户和其他软件修改,从根本上破坏了您的应用程序。而且它占用了宝贵的环境空间()
  • 更改当前目录:当前目录是动态链接库搜索顺序的一部分,因此更改它(例如通过.lnk的启动目录设置)可能有效。但是,当前目录在进程的所有线程之间共享,任何线程都可以随时更改它。从本质上讲,这使得当前目录毫无用处(实际上,对于任何东西)


1如果您提前知道这些库,您可以手动加载它们(),并让延迟加载辅助函数提取它们。但是,如果这些模块中的任何模块具有在标准搜索路径中找不到的依赖项,那么这将失败。

好吧,创建插件是我探索的第一个解决方案,不幸的是没有成功。它可以编译,一切正常,但只要我使用Qt库类。当我给插件一个来自主应用程序的对象引用来使用它的方法时,这个项目就不再链接了。然而,这听起来像是一个完全不同的问题,我将马上把它作为一个问题发布。谢谢你的解释,切科·R!“更改PATH环境变量:虽然易于实现,但这是局部问题的全局解决方案”,对此我非常同意。修改环境变量是个坏主意。谢谢你,@IInspectable,给了我全面的解释!