2010-07-17 41 views
2

我在Windows XP上使用gcc編譯器(MinGW)創建一個.dll庫libdir.dll比我試圖構建一個使用該庫的程序。
我不想將該.dll文件放入System或System32文件夾中,也不想將其路徑設置爲PATH變量,我想要的是將該信息提供給程序本身。
我知道有一個-R-rpath交換機可用,所以我要把它與其中之一連接起來。在Windows上使用-R和-rpath開關鏈接

首先-rpath:
GCC -L /路徑/到/ lib中-Wl,-rpath, /路徑/到/ lib中main.o -Ldir -o PROG

比-R:
GCC -L /路徑/到/ lib中-Wl,-R, /路徑/到/ lib中main.o -Ldir -o PROG

成功鏈接到prog,但是當我啓動程序Windows打印消息,它找不到libdir.dll
所以我的問題是什麼錯了,爲什麼路徑libdir.dll不知道在運行時甚至當我使用適當的開關?

假設我有prog1和prog2,每個都包含它們自己的libdir.dll副本,並且它們都開始在庫中加載代碼的同時運行。內存中會發生什麼情況?有兩個副本加載或鏈接器數字有一個副本,並使用這兩個程序?
第二個問題是關於如何加載庫(任何操作系統)。連接器是否總是加載整個庫或只需要加載部分?例如,如果程序引用功能foo()在庫中,鏈接器是否僅將該函數映射到內存中或整個庫第一?

回答

1

只有兩個真正的選擇:將DLL放在與EXE相同的文件夾中,或放入EXE的工作目錄中。後者沒有多少選項,因爲您必須創建一個快捷方式使默認工作目錄與包含EXE的目錄不同。

如果您想與其他應用程序共享DLL,則不要將該DLL放在與EXE相同的目錄中。爲了避免這種造成不可避免的DLL地獄,你需要將DLL存儲在並行緩存中。您需要創建清單並將其嵌入到EXE中的工具以及將該DLL部署到目標機器所需的安裝程序可能很難通過工具鏈來實現。無論如何,這是非常罕見的。這個問題的

+0

可以喲你請一步一步向我解釋如何將它放在該.exe的工作目錄中,然後該怎麼做? – paleman 2010-07-17 17:25:09

+0

你的意思是「如何創建一個快捷方式?」右鍵單擊桌面+新建。 – 2010-07-17 17:32:17

+0

我以爲你說的是​​別的,新的頭腦。 – paleman 2010-07-17 17:53:08

0

部分是本項目重複:Is there a Windows/MSVC equivalent to the -rpath linker flag?

答案的總結是,有RPATH的Windows上沒有直接的等價物。

既然你排除放置在默認的庫搜索路徑您的DLL(這在Windows上包括您列出的系統目錄,並在PATH環境變量中的目錄),如果只剩下這些選項:

  • 使用批處理文件
  • 放置在同一個目錄
  • 所有的DLL和可執行文件在你的程序製作OS級別領導人呼籲增加了DLL搜索路徑
+0

感謝您提供另一個問題的鏈接。然而,你忘記提到可能也有竅門的顯式機制。 – scrutari 2016-12-21 08:53:30