贊助廠商

娛樂城推薦

首頁

電腦與網際網路/其他:電腦列表

C/C++- 請教link lib跟dynamic load dll的差異

開發平台(Platform): (Ex: Win10, Linux, ...) Win10/Win7編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)Visual Stdio 2019額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) DirectX 12問題(Question):請教compile時1. compile設定link library做linking, 程式執行時放dll2. compile不設定link library, 程式執行時dynamic load dll差異性補充說明(Supplement):這問題應該說是請教linking如何做的 並非單純C/C++的問題我編寫一個測試DirectX 12的測試程式IDE是VS2019, OS是win10開發完畢後編譯完 我分別拿到win10/win7兩台測試電腦上執行測試結果發現在win7上出了問題 因為win7上面沒有d3d12.dll這個檔案而d3d12.lib是放在Win SDK Kit 10版底下, 我安裝VS2019就會有,因此compile做linking當然是沒問題的我把程式碼改為dynamic load dll的方式去做compile的時候不再link d3d12.lib了問題來了 原本我"以為" 所有d3d12.h裡面我有用到的API全都必須要在我做LoadLibrary("d3d12.dll")之後一個一個使用GetProcAddress去把每個API都load出來變成function pointer使用但我使用dependence去檢查d3d12.dll 卻發現裡面的API我有用到的只有一開始initial DirectX 12第一步要做的D3D12CreateDevice()其他像是Swapchain/CommanQueue/CommonList/Fence等等 API都不在裡面但是這些東西需要的API的確都定義在d3d12.h裡面結果我dynamic load dll的修改 只需要改兩個地方1. D3D12CreateDevice() 需要load d3d12.dll2. CreateDXGIFactory2() 需要load dxgi.dll2這一點是因為CreateDXGIFactory2()這個API在win10的dxgi.dll才有win7底下雖然也有dxgi.dll 但比win10來的舊所以我也無法對dxgi.lib做static link, 執行程式會因為dll/lib不match跳出找不到CreateDXGIFactory2()的訊息這兩個API改用GetProcAddress的方式 其他所有DX12用到的API "完、全、不、用、改"這樣程式就跑出正確的結果了這結果讓我非常納悶 我想法是這樣A. 既然我已經沒有設定要link d3d12.lib 那麼我的程式應該完全不知道要去跟d3d12.dll找他的API (雖然我不知道Linking怎麼做 但一旦設定d3d12.lib做linking 合理推測一定是會讓我的程式知道執行起來後要去找d3d12.dll) 既然D3D12CreateDevice需要GetProcAddress 其他為啥不用?B. d3d12.dll裡面也沒有那些Swapchain等相關的API在裡面 所以是在其他的dll裡面嗎? 我在system32底下看到除了d3d12.dll以外還有兩個檔名有d3d12開頭的dll 但我用dependence沒查到相關的APIC. 如果B的推測是對的 其他那些API不在d3d12.dll裡面, 那為啥header都在d3d12.h? 其他那些API到底藏到哪一個dll裡面阿?以上的疑惑 如果有熟悉DirectX運作原理的話還請幫小弟解惑 非常感謝…--
  • 發問日期:2021-06-02 01:40:09

友站連結