lib和dll中全局变量的链接性及用法总结

今天在公司干完活后思考了lib和dll的链接性,然后做了测试,发现和我想象的不大相同,具体总结如下:
lib: lib中的全局变量在链接它的单元中是可以通过extern访问到的,但是链接它的单元如果定义了一个相同的全局变量那么lib中的全局变量将被忽略,而且不会出现重复定义的错误。lib中的函数则不相同如果链接它的单元有了相同的函数就会发生重复定义在lib的cpp中定义一个静态的变量会被所有用到这个lib的模块公用,在链接一个程序的时候会自动的去掉重复链接的lib保证某个lib只有一份代码存在,如果在其他lib中直接包含这个cpp那么这个静态变量将不会被公用。所以如果要在几个lib中共享一部分代码那么最好把这部分公共代码也做成lib,那样会避免问题的发生。

 
dll: 要访问dll中的全局变量则要加extern __declspec(dllimport)前缀才行,那是因为这是一个导出的全局变量,如果dll中的全局变量定义或者声明的时候不加__declspec(dllexport)前缀的话在使用它的单元是没有办法链接到这个全局变量的,这是和lib不一样的地方,dll和lib的本质区别在于lib参加链接而dll只有显式导出的部分才参加链接,而且dll衔接产生的调用是通过一个导入表间接进行的,速度略慢一点点。dll中变量导出之后它的名字和lib的有所不同带有__imp__前缀。


上面都是我的个人愚见,欢迎指教。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
之前放了一份劫持补丁的写法(https://bbs.125.la/thread-14255649-1-1.html )但是需要配合我扩展的WonderWall+黑月来编译。以前都是自己私下用未公开,现在用易越来越少了,现在放出来也算对易做点贡献,希望能帮助到易友。 主要功能就是支持全局变量的汇编写法,这个在15年左右的时候就写好了,由于自身比较懒一直没有写支持多行模式的,反正将就着用。汇编支持全局变量的好处是显而易见的,在hook的时候更加的灵活,无论什么类型的调用都可以轻松掌控。 下面就是一些较原版WonderWall更新的内容,记得的大概就这些: 特别声明:只支持5.11版本的易语言 +加入内联支持全局变量(单行)+模块快捷添加+DLL编译,导出函数支持nake处理(在源文件目录下新建一个和源文件同名+_nake.ini 的文件,内容是需要处理的函数名称)*改变调用内联汇编模块Fasm方式,方便更新Fasm.dll随时替换在原有WonderWall基础上扩展,这里感谢baby的无私开源!使用方法:按解压后文件结构复制到易安装目录.+调试信息长度去除限制,以前输出信息太多会被自动清空。+源文件名+_Command.ini 可以定义编译参数,格式如下[linker]extra_args= /MAP;  extra_args用于指定附加给链接器的额外参数。默认为空。/NOD:libc.lib /BASE:0x13140000 /DEBUG /PDB:none;  VS2010编译器 要想基址固定,在链接去掉/DYNAMICBASE加上/FIXED+源文件名+.def 放置到源码目录,可以改变导出函数序号,exe也能导出函数+输出链接命令行参数+增加编译时显示等待信息框,方便改变链接时候修改链接的文件,如.def .obj这些+修正Win10系统输入时输入法窗口不在光标位置的问题 特别声明:只支持5.11版本的易语言 支持win10,黑月+WonderWall Plus 组合没有问题,其他插件未测试。 放几张以前代码使用图片

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值