C_and_CPP 板


LINE

開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1615392100.A.AAC.html ※ 編輯: Keitaro (1.163.139.10 臺灣), 03/11/2021 00:04:06
1F:推 LPH66: 如果不限 DirectX 而是比較基本的 linking 觀念的話 03/11 00:05
2F:→ LPH66: #1LmYWwYp (Programming) 這篇文章可以先看看 03/11 00:05
3F:→ LPH66: 你這裡還需要釐清一點是這裡的 .lib 應該有兩個 03/11 00:06
4F:→ LPH66: 一個是靜態 .lib, 那就跟一般連結沒兩樣 03/11 00:06
5F:→ LPH66: 另一個是跟著 .dll 一起的 .lib, 這個才是我那篇文談的那個 03/11 00:07
這我瞭解 我知道當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 但我不知道命名上有什麼差異 這三種方法的正式名稱分別是什麼呢?
6F:→ ofy: DirectX是COM DLL(Component Object Model)....導出表找不到 03/11 01:56
7F:→ ofy: 執行時載入的話查一下DllGetClassObject / 03/11 01:57
8F:→ ofy: CoCreateInstance / CoGetClassObject 03/11 01:57
9F:→ ofy: 東西都以virtual function/VTable的方式編在DLL裡了 03/11 02:07
10F:→ ofy: 為了方便你使用,動態連結庫幫你做了許多事 03/11 02:10
我在d3d12.h裡面的確看到我要找的那堆API一堆都是pure virtual function沒錯 但還是不太懂您說的東西 可否再進一步解釋? 非常感謝 ※ 編輯: Keitaro (60.251.156.103 臺灣), 03/11/2021 09:51:14
11F:推 b0920075: 你舉的第二個例子已經是動態連結了吧 03/11 11:25
意思是 1. static link 2. dynamic link 3. dynamic load dll 這樣嗎? ※ 編輯: Keitaro (210.242.38.175 臺灣), 03/11/2021 14:39:23
12F:推 b0920075: 靜態動態應該是指在執行期間的時候,不是編譯期間,若 03/11 16:27
13F:→ b0920075: 執行時還需要找symbol地址那就是動態,執行前symbol地 03/11 16:27
14F:→ b0920075: 址全都找好了就是靜態,執行時用 dlopen之類將額外的li 03/11 16:27
15F:→ b0920075: brary load 進來就是dynamic loading ,windows的話不 03/11 16:27
16F:→ b0920075: 知道有沒有差 03/11 16:27
17F:→ b0920075: 你最後的留言應該是正確的 03/11 16:29
18F:推 Killercat: 其實你說的2 3是同一件事 只是2用系統路徑 3指定路徑 03/12 11:52
19F:→ Killercat: er..等等 其實code寫起來不同 請忽略掉我上一行 XD 03/12 11:53
20F:→ descent: 你是想知道 linker 對動態連結程式庫做了什麼手腳嗎? 03/18 21:40
是的 請問能推薦參考的書目或網址嗎 感謝 ※ 編輯: Keitaro (1.163.140.202 臺灣), 03/30/2021 01:22:05
21F:→ Lipraxde: Linker and Loader 04/01 17:43







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP