2016-08-23 46 views
1

我有一個Qt5 C++項目,主應用程序和一個(由我創建的)共享庫。它編譯並執行,我可以部署它。問題是,通過部署,我需要將我的共享庫的已編譯的dll與主可執行文件放在同一個目錄中。但是,我主張保持頂級文件夾相對乾淨,並將必要的文件放入適當的文件夾子樹中。所以,我的問題是,爲了將dll的路徑更改爲myApp/myLib,myApp是主應用程序的可執行文件所在的文件夾,我應該在* .pro文件中放入什麼內容。在主可執行文件的子文件夾中部署Qt C++共享庫的DLL

回答

1

由於Windows爲您的程序搜索DLL,而不是程序本身,因此無法告訴makefile在哪裏搜索庫。

但您可以:

  • 添加所需的文件夾中的DLL我們去PATH。
  • 製作啓動腳本,設置庫所在的路徑,然後啓動程序。
  • 靜態編譯,如果您遵守LPGL或Qt Comercial許可證,則視您的情況而定。

作爲一個備註:Qt插件可以做你想做的,但是核心依賴不是Qt插件本身。

+1

那麼,創建一個插件是我探索的第一個解決方案,不幸的是沒有成功。它編譯了一些永恆的作品,但只要我使用Qt庫類。當我給插件引用主應用程序中的一個對象以使用它的方法時,項目就不再鏈接了。然而,這聽起來像是一個完全不同的問題,我將立即將它張貼出來。謝謝你,Checo R,爲了解釋! 「 – scopchanov

2

Dynamic-Link Library Search Order相當靜態。要包含子目錄,需要自定義DLL加載。有很多方法可以完成你正在尋找的東西。

  • 延遲加載庫(請參閱Linker Support for Delay-Loaded DLLs)並在應用程序啓動過程中調整搜索路徑。
    默認情況下,在任何代碼運行之前,在進程初始化期間加載編譯時動態鏈接庫。鏈接器提供了延遲加載DLL的選項,直到程序調用該DLL中的函數。這爲您在應用程序啓動過程中調整DLL搜索路徑提供了一個機會窗口(例如,調用SetDllDirectory)。
    注意:請記住,在運行任何用戶代碼之前初始化全局變量。如果全局初始化器從延遲加載庫中引用一個符號,則該庫也會在任何用戶代碼運行之前加載。這不是針對這些情況的解決方案。
  • 使用自定義延遲加載助手延遲加載庫(請參閱Understanding the Helper FunctionDeveloping Your Own Helper Function)。
    對於每個導入,系統調用輔助函數。除其他外,輔助函數負責加載模塊。這允許實現任意複雜的庫搜索。在這種特殊情況下,可能最容易爲庫加載設置通知掛鉤(請參閱Calling Conventions, Parameters, and Return Type)。

還有其他的方法,這可能看起來很有吸引力,但你不應該真的在使用這些方法。這裏是其中的理由,爲什麼不使用它們的列表:

  • 更改PATH環境變量:雖然容易實現,這是一個全球性的解決局部問題。更改全球環境變量會影響整個系統。它可以由用戶和其他軟件修改,基本上打破了你的應用程序。它耗盡了寶貴的環境空間(What is the maximum length of an environment variable?)。
  • 更改當前目錄:當前目錄是動態鏈接庫搜索順序的一部分,因此可能需要更改它(例如通過啓動目錄設置.lnk)。但是,當前目錄在進程的所有線程之間共享,並且任何線程都可以隨時更改它。實質上,這使得當前目錄無用(對於任何事情,真的)。


如果你事先知道的圖書館,你可以改爲手動加載它們(LoadLibrary),並讓他們通過延遲加載輔助函數回升。但是,如果這些模塊中的任何一個都具有無法在標準搜索路徑中找到的依賴關係,則這將失敗。

+0

」更改PATH環境變量:雖然易於實現,但這是針對本地問題的全局解決方案「 我完全同意這一點。修改環境變量是一個壞主意。 謝謝你,@IInspectable,爲全面的解釋! – scopchanov

相關問題