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/cn.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灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP