1. C++代码里调用别人的库、或者写库给别人用、大概有如下的方法(只讨论windows系统的情况):
---- a) 提供头文件 h 、 静态库 lib -- 》 静态链接
---- b) 提供头文件 h、 动态库 dll 、库文件 lib --》动态链接:虽然有lib文件、但这个lib文件只是对 dll 文件的说明、其实编译出来就会发现这个 lib 文件比静态链接时的 lib 文件小很多!
---- c ) 只提供 h、 dll -- 》也是动态链接,但没有 lib 文件很容易弄出 link error 、想用这个 dll 里的函数就必须动态加载!
要把握住一个核心:头文件只有函数和变量的声明(declaration)、而真正的函数体、或者说是定义(definition) 是在 cpp、lib、dll三者之中!(规范的来说、不在 h 文件写实现代码)
你如果不调用具体的函数、那就一切相安无事、但一旦调用、却不给 vs 函数的实现、那就是 linkerr
顺便说一下、不存在头文件的修复方法: 添加附加库目录即可、实在不行可以 #include"../../.../foo.h" 这样写相对路径、反正很好解决。
至于动态链接和静态链接的区别、百度一下就知道了、不过可以简单认为:静态链接会和真正的程序代码打包到一个exe中、而dll不是,毕竟玩单机游戏时删了一个dll就全废了!
有了这个认识、下面来讲一下怎么用 VS 2019 生成 dll 文件、并导入别的项目使用:
首先:造一个解决方案、里面造两个项目(其实可以造两个 solution、不过那样得来回切换!应该熟悉一下多项目解决方案怎么玩!)
右击 Deps 项目、打开属性面板(这个项目里假设写一些工具、然后把这个项目做成dll、给 MainApp使用!)
咱们把 输出的dll 和 lib 都放在解决方案文件存在的那个目录下的Output目录
并且设置输出类型是 dll
然后在这个项目里的Utils.h定义一个要导出的函数:
简单实现:
接下来、build dll、右击Deps 项目、生成!:
打开 OutPut文件夹、应该可以看到有一个很小的 lib 文件和一个dll文件:
下面、编辑 MainApp的项目属性、注意最后的exe也输出到 Output中、这样的话执行起来就能找到 dll 的位置:
并且要添加 刚才制作出来的lib文件(配链接需要两步走):
然后正式写代码:
这里写个函数声明、加上 dllimport
把 main app 设为启动项目(右击项目、然后容易找到),运行、一切正常!:
但我们不想把声明放在 cpp 中、那怎么办?用头文件!
这个东西里的内容和 Deps 工程的Utils.h 内容基本一样,除了这里是要进行导入:
那我们用头文件就行了:
也能正常运行:
那么既然这两个头文件的内容除了 import 和 export 有区别之外、别的都没区别、那么肯定有如下的写法成立:
这样、这个 Utils.h 就可以在 both 依赖项目 和 被依赖项目同时使用、只是简单修改一下编译时的参数、指定一个 IMPORT 或者是 EXPORT就行:
这样设置预处理时的宏
发现在 Dep 工程里的 Uitls文件出现了高亮:
接下来可以移除MainApp里的那个头文件、用相对路径去导入:
同样在 MainApp 项目里设置 IMPORT 宏:
生成 Deps工程、再运行 MainApp、一切正常工作!
标签:__,文件,头文件,lib,项目,dllimport,declspec,dll,链接 From: https://www.cnblogs.com/gs590/p/16858689.html