路遥见人心,日久知马力

博客园 首页 新随笔 联系 订阅 管理

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、一切正常工作!

 

 

 

 

 

posted on 2022-11-04 18:31  只讲大白话  阅读(1053)  评论(0编辑  收藏  举报