為什麼這篇D3D12 Win7鄉民發文收入到精華區:因為在D3D12 Win7這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者Keitaro (動き出す時間...)看板C_and_CPP標題[問題] 請教link lib跟...
開發平台(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, 程式執行時放dll
2. 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.dll
2. CreateDXGIFactory2() 需要load dxgi.dll
2這一點是因為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沒查到相關的API
C. 如果B的推測是對的 其他那些API不在d3d12.dll裡面, 那為啥header都在d3d12.h?
其他那些API到底藏到哪一個dll裡面阿?
以上的疑惑 如果有熟悉DirectX運作原理的話還請幫小弟解惑 非常感謝…
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.139.10 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1615392100.A.AAC.html
※ 編輯: Keitaro (1.163.139.10 臺灣), 03/11/2021 00:04:06
這我瞭解 我知道當lib在 compiler出來的時候如果選擇build出靜態lib的話
在我的程式link lib時會把lib "完全包進來" 包在編譯出來的執行檔裡面
這種方式執行程式時不需要dll檔
不過我一直不太懂如何區分這三種用法到底是如何定義他的命名
1. compiler時link static lib, 執行時不需要dll
2. compiler時link lib, 執行時需要dll
3. compiler時不需要link lib, 執行時使用LoadLibrary()以及GerProcAddress()
我以為1/2都是static link 但我不知道命名上有什麼差異
這三種方法的正式名稱分別是什麼呢?
我在d3d12.h裡面的確看到我要找的那堆API一堆都是pure virtual function沒錯
但還是不太懂您說的東西 可否再進一步解釋?
非常感謝
※ 編輯: Keitaro (60.251.156.103 臺灣), 03/11/2021 09:51:14
意思是
1. static link 2. dynamic link 3. dynamic load dll
這樣嗎?
※ 編輯: Keitaro (210.242.38.175 臺灣), 03/11/2021 14:39:23
※ 編輯: Keitaro (1.163.140.202 臺灣), 03/30/2021 01:22:05