VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 829|回复: 1

[原创] DLL共享节在VS2013中的问题:LINK warning LNK4039 用 /SECTION 选项指定的节不存在

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-1-14 16:55:17 | 显示全部楼层 |阅读模式
几年前用过DLL共享节,实现起来也没什么问题,无非就是那么几步,无非就是那么几个注意的地方。最近有会员问我一个关于DLL共享节在高版本编译器中的问题,让我费了不少劲。

先来说说什么是DLL共享节!

默认情况下,DLL中的数据在不同进程加载该DLL的时候都是有自己的一份拷贝,互不影响。但是如果想要多个进程在加载该DLL的时候,都共享同一个变量或者几个变量呢?
于是共享节就出现了。。。在DLL中可以用数据段来实现共享区间的,也叫做共享节,有了这个共享区间,各进程都可以方便的共享数据。

在DLL中实现共享节也比较简单,就那么几步,这里面再给大家说一下:

①、在DLL的cpp文件中添加一个自定义的共享节:
  1. #pragma data_seg("SyShared") //共享节开始
  2. int g_data = 0; //要共享的变量
  3. #pragma data_seg()        //共享节结束
复制代码


备注:"SyShared"就是自定义共享节的名字,长度一般是 <= 8个字节,多了会被截断,区分大小写。
int g_data = 0; 就是要共享的变量。注意这里面一定要对共享的变量进行初始化操作,不要以为放在这里面就以为一定在这个共享节中,如果你没有初始化这个变量的话,那么这个变量还是放在默认的未初始化的共享节中。这样还不能达到我们共享变量的目的。

②、告诉链接器该共享节里面的变量是要共享的,并且共享属性是什么?
  1. #pragma comment(linker, "/section:SyShared,rws")
复制代码

备注:
SyShared 的名字一定要与上面定义的共享节一模一样,注意大小写和空格什么的。
rws 就是共享属性,R - Read读,W - Write写,S - Share共享。

好了,基本就是上面两步。简单吧?这样就可以实现一个自定义的具有读写属性的共享节了。
在老版本的VS编译器中编译也都没什么问题。起码VC6.0是没问题的。在高版本的VS编译器中的Debug中也是没问题的,但是一到Release中就报个警告。我再VS2013的Release版本中的警告信息如下:
LINK : warning LNK4039: 用 /SECTION 选项指定的节“SyShared”不存在

截图如下:
DLL共享节在VS2013中的问题:LINK warning LNK4039 用 /SECTION 选项指定的节不存在

为什么呢?而且虽然是个警告,编译也通过了,但实际上是这个共享节没共享成功的。
最后,终于找到了解决方法:在共享变量的前面加上:__declspec(dllexport)
最终的代码如下:
  1. #pragma data_seg("SyShared")
  2. __declspec(dllexport) int g_data = 0;
  3. #pragma data_seg()

  4. #pragma comment(linker, "/section:SyShared,rws")
复制代码


截图如下:
DLL共享节在VS2013中的问题:LINK warning LNK4039 用 /SECTION 选项指定的节不存在

这样就OK啦!大家不妨试试!




上一篇:WinApi.chm
下一篇:求一个c++学习路线

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

94_avatar_middle
online_vip eagle1103 发表于 2018-1-23 02:17:51 | 显示全部楼层
还有一种方法是在def文件中增加,可以在后缀加上NONAME, 这样别人就看不到具体的名字了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-15 04:47

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表