[英]Picking a dll in a particular path while loading a shared library in Windows
我正在使用MinGW創建一個共享庫,該庫使用LoadLibrary函數動態鏈接和加載。 我的共享庫依賴於可以在路徑上兩個不同位置找到的dll。 這兩個不同(兩個不同的版本),並且在加載庫時,它選擇了錯誤的dll。 如何明確指定要選擇的dll?
更具體地說,這些是我正在使用的命令:
匯編
g++ -m64 -O3 -c my_file.cpp -o myfile.o
創建共享庫
g++ -m64 -shared myfile.o -o myfile.dll
我已經嘗試了很多東西,包括-L選項,但是還無法弄清楚該怎么做。 我也在網上搜索了幾個小時,但結果沒有用。
任何幫助深表感謝。
提前致謝
原來,我不想加載的dll確實位於“當前進程的可執行模塊所在的目錄”。 具有相同名稱的另一個dll位於路徑上,而不是Windows第一次出現的位置。 從該文檔中可以看出,LoadLibrary始終會從當前進程的可執行模塊所在的目錄中選擇dll,無論該dll是否存在。 有沒有解決的辦法? 移動dll確實不是一種選擇,因為這是我們正在構建的第三方程序
逐步說明Windows如何查找DLL的時間順序。
https://msdn.microsoft.com/zh-CN/library/7d83bc18.aspx
在上述鏈接中的所有步驟之后,當涉及PATH環境變量時,Windows從左到右瀏覽PATH變量中列出的每個目錄。
首先嘗試是否可以將正確的DLL放在上面鏈接中列出的任何位置。 因為路徑環境變量是最后要研究的內容。
如果無法執行上述步驟,請確保正確的DLL路徑位於PATH環境變量中 錯誤的DLL路徑的左側 。
下面的文章提供了一些使用SetDllDirectory
和LoadLibraryEx
API調用來實現替代DLL搜索策略的指導,並假設它們是選項(您提到了LoadLibrary
當前正在使用)。
https://msdn.microsoft.com/zh-CN/library/windows/desktop/ms682586(v=vs.85).aspx
事實證明,還有另一個稱為LoadLibraryEx的Windows函數,該函數允許顯式指定將要加載庫的路徑。 您可以在此處了解更多信息:
https://msdn.microsoft.com/zh-CN/library/windows/desktop/ms684179(v=vs.85).aspx
具體來說,正如文檔所述:
如果使用此值,並且lpFileName指定了絕對路徑,則系統將使用“備注”部分中討論的備用文件搜索策略來查找指定模塊導致加載的關聯可執行模塊。
和
如果lpFileName指定了絕對路徑,並且dwFlags設置為LOAD_WITH_ALTERED_SEARCH_PATH,則LoadLibraryEx將使用更改后的搜索路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.