2017-02-27 76 views
1

我有幾個別人的產品庫,很少有我的庫(dll和頭文件)。 對於我的項目的良好結構(只是爲了增加我的知識),我想將dll放在其他目錄中(而不是使用exe的dir)。使用其他目錄中的庫生成項目。 Windows,MinGW

據我所知,Windows使用dll(僅針對exe文件查看dll)只能在exedir和sysdir中使用。 另外,存在的regkeys可以幫助我,但它是全局解決方案,因爲PATH var。

1.我可以鏈接EXE與一些DLL,它放在較低的層次關於EXE的目錄嗎?怎麼樣?

另外,我想用這個MinGW。

我發現沒有足夠的信息關於我的問題,我發現這個g ++鍵爲鏈接器:
-Wl,-rpath-link,...; -Wl,-rpath,...;

2.我可以用MinGW在Windows上使用這個鍵來解決我的問題嗎?怎麼樣?

我嘗試這樣做:
g++ -Wl,-rpath-link,.\out\lib\ -Wl,-rpath,.\lib\ -L .\out\lib\ -l:foolib.dll main.o -o out\main.exe
但我仍然只有dll文件放在exedir可以exe文件沒有錯誤運行。

所以,我發現ARG(?)$ORIGIN-Wl,-rpath,...,據我所知,是一些obj文件的完整路徑workdir?或不?

3.什麼是$ ORIGIN?我應該使用它來解決我的問題嗎?

對不起,我的英文。先謝謝你。

回答

0
  1. 我可以鏈接EXE與某些DLL,它放在較低的層次關於EXE的目錄嗎?怎麼樣?

不,不幸的是,你不能。 Windows DLL搜索路徑順序默認爲as follows

  1. 應用程序從中加載的目錄。
  2. 系統目錄。使用GetSystemDirectory函數獲取此目錄的路徑。
  3. 16位系統目錄。沒有獲得該目錄路徑的函數,但它被搜索。
  4. Windows目錄。使用GetWindowsDirectory函數獲取此目錄的路徑。
  5. 當前目錄。
  6. PATH環境變量中列出的目錄。

所以,如果你不能將你的DLL放在其中一個目錄中,那麼它們將不會被自動動態加載看到。 但是,可能的替代方法是在啓動EXE之前在本地設置PATH。例如,附加到PATH的BAT文件然後啓動該程序或您編寫的其他程序執行相同操作。

-Wl,-rpath-link,...; -Wl,-rpath,...;

  1. 我可以用MinGW來解決我在Windows上的問題嗎?怎麼樣?

不。這些不適用於MinGW,只會被忽略。 Windows上沒有相同的內容。與ELF二進制文件(例如Linux)不同,EXE不支持附加運行時搜索路徑的規範。有關更多信息,請參見Linking with -R and -rpath switches on WindowsIs there a Windows/MSVC equivalent to the -rpath linker flag?

  1. 什麼是$ ORIGIN?我應該使用它來解決我的問題嗎?

$ORIGIN僅僅是一個特殊的記號,基本上只是表示「如果這應用程序所在的路徑」。從the man page for ld

$ORIGIN (or equivalently ${ORIGIN}) 
      This expands to the directory containing the program or shared 
      object. ... 

由於-rpath不工作在Windows反正,這是這裏無關緊要。


所以你必須要麼把DLL文件在他們的預期位置,或啓動可執行文件通過批處理文件或其他程序,設置了PATH第一。

順便說一下,請不要向系統/用戶範圍的PATH變量添加任何內容,前提是您可以提供幫助。我知道這很誘人,許多應用程序都這樣做,但是對於用戶來說,污染PATH成爲一個問題,特別是當安裝了許多具有相同DLL/EXE版本衝突的應用程序時。

相關問題