How to resolve '_DllMain@12 already defined in xxx.obj' ?

2023-11-07

转自:http://blog.csdn.net/psusong/article/details/5858388

    用Visual C++编写DLL,如果在new project时选了MFC DLL,而后又想写成Regular DLL,即拥有自己的DllMain()入口函数,则在build时会遇到类似如下的link错误:

 

1>uafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in xxx.obj

 

此种连接错误在用DirectShow + MFC实现filter的时候必然会遇到:

 

"If you try to use MFC framework classes (CWinAapp-, CWnd- derived) in your AX filters, you end up with tons of error messages from the not-initialized MFC framework. To fix this several changes need to be done in the initialization functions (dllentry.cpp)."

 

要解决此类问题,有三种解决方案:

 

1)只需要在工程设置里面,把WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL中的_USRDLL,删除,就可以正确编译了。

 

2)调整C runtime和MFC runtime的连接顺序,参见:http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652

 

3)http://blog.edu.cn/user3/RFox/archives/2008/2140436.shtml

 

I want to add some initial code in DllMain in a MFC dll project, but after I added the code and compiled, there was a link error:

 

mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in DLLMAIN.OBJ

 

DLLMAIN.cpp is the file I created by my own and I define DllMain() in it.

 

What’s the reason? the linker complains that I have a DllMain in DLLMAIN.cpp but there’s another DllMain in mfcs42d.lib.

 

So how to use my own DllMain if a MFC dll project? There’s a quick answer on codeguru , but that article just show the tip without explaining it with more details.

 

The article says, just copy MFC’s dllmodule.cpp into your own project and compile, it will be OK. It seems to be nonsense but after I tried I found it works. But why? By commenting out unnecessary lines, I find these lines are the key point: //(dllmodule.cpp)

 

    // The following symbol used to force inclusion of this module for _USRDLL 

    #ifdef _X86_

    extern “C” { int _afxForceUSRDLL; }

    #else

    extern “C” { int __afxForceUSRDLL; }

    #endif

 

Do you noticed the comment? it forces the inclusion of the module of dllmodule.obj. But how? A searching for _afxForceUSRDLL in MFC source code gives me the answer:

//afx.h

 

    // force inclusion of DLLMODUL.OBJ for _USRDLL

    #ifdef _USRDLL

    #pragma comment(linker, “/include:__afxForceUSRDLL”)

    #endif

 

Again the MFC designer gives us a good comment: “force inclusion of DLLMODUL.OBJ”, OK, got it.

 

Now let summary it up:

    1)When you try to use MFC library, you surely will include afx.h directly or indirectly 

    2)then MFC(afx.h) tell the linker to find the symbol of __afxForceUSRDLL and put that object which contains __afxForceUSRDLL into the program, so linker searches and puts dllmodule.obj into my program, for __afxForceUSRDLL is defined in dllmodule.cpp That’s the common scenario.

 

Then you want to use your own DllMain in a mfc dll project, linker complains that there are two DllMain, one in your code, one in Dllmodule.obj.

 

The solution? Tell the linker to add my dllmain.obj for __afxForceUSRDLL. So we define __afxForceUSRDLL in our own cpp file where our own DllMain is defined, then the linker will ignore mfc’s dllmodule.obj and see only one DllMain and never complains.

 

So the solution is just to add extern “C” { int _afxForceUSRDLL; } in the file where your own DllMain is defined, copying mfc’s dllmodule.cpp is not necessary :-)

 

延伸阅读:

 

1) How to Provide Your Own DllMain in an MFC Regular DLL

http://support.microsoft.com/kb/148791

2) Creating a DLL in DirectShow

http://msdn.microsoft.com/en-us/library/ms899461.aspx

http://msdn.microsoft.com/en-us/library/aa451266.aspx

3) http://www.codeguru.com/cpp/w-p/dll/article.php/c109/

4) DirectShow BaseClasses and MFC

http://blog.monogram.sk/janos/2008/01/10/directshow-baseclasses-and-mfc/

5) http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

How to resolve '_DllMain@12 already defined in xxx.obj' ? 的相关文章

  • 解决源自 .lib 文件的“本地定义的符号”和“未解析的外部符号”

    我正在尝试在 Windows 7 64 位上的 Visual C 2010 上使用开源库 GDCM 编译我的项目 我已在我的项目中包含了所需的 lib 文件 gdcmDSED lib 和 gdcmMSFF lib 但是 编译器抱怨超过 10
  • MinGW支持MFC吗?

    我已经使用 MinGW 开发了 WinAPI 应用程序 没有出现任何问题 现在 我可以用 MFC 做同样的事情吗 我只是在这里猜测 但我认为您需要购买 Visual Studio 的副本才能获得使用 MFC 的许可证 MFC 也不因其对 C
  • 直接列表初始化和复制列表初始化之间的差异

    我想知道以下两种类型是否有任何区别std vectorC 11 及更高版本中的初始化 std vector
  • 如何使用 MFC 禁用顶级菜单项并使其变灰

    我有一个对话框应用程序 我希望在对话框顶部有可单击的菜单项 这些项目不显示下拉菜单 但实际上运行关联的命令 我通过在对话框属性中设置 Popup False 并分配消息 ID 来做到这一点 但我的问题是 当项目可点击没有意义时 无法正确禁用
  • 即使我确实为变量设置了初始值,数据段也没有被初始化

    我已经编写了一个代码 该代码应该生成某种数字列表 但是即使我为它们分配了初始值 我的数据段变量也没有被初始化 This is how DS 0000 looks when I run it 这是我的代码 但数据段只保留垃圾值 MODEL s
  • Radio r = Radio("PSR", 100.8) 和 Radio("PSR", 100.8) 有什么区别? [复制]

    这个问题在这里已经有答案了 我是 C 新手 正在尝试理解一些东西 我的 main cpp 中有这段代码 Radio r Radio PSR 100 8 或该代码 Radio r PSR 100 8 两者似乎都有效并且做同样的事情 那么有什么
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • dependency walker 在正确运行的系统上给我错误

    我的系统上缺少 dll 我有以下消息 无法加载文件或程序集 mydll dll 或其依赖项之一 当然 mydll 存在于此 它很可能是它所依赖的另一个 dll 我下载了 dependency walker 来检查它可能是什么 我首先在另一个
  • java.library.path 中没有 ocijdbc12

    我正在尝试使用 OCI 驱动程序通过 java 程序连接到 oracle 以下是配置 Windows 7 32 位 JDK 1 7 Oracle 客户端 11g R2 ojdbc7 jar在我的独立应用程序的类路径中 但我收到以下异常 Ex
  • 无法从 ASP.NET 调用 DLL

    您好 我有一个 C Dll 它将与 cobol 应用程序交互 我们想通过互联网将数据发送到cobol 所以我创建了一个 C DLL 它将调用 C DLL 当我执行控制台应用程序时 它工作正常 但是当我尝试从 ASP NET 调用相同的 DL
  • 屏幕截图忽略了一些窗口

    我正在 MFC 中工作 我正在尝试捕获桌面的 bmp 我正在使用 GetDC NULL 来执行此操作 但它似乎忽略了特殊的皮肤窗口 它似乎忽略了用 UpdateLayeredWindow 绘制的窗口 此行为似乎仅发生在 Vista x64
  • 在C++中初始化静态指针

    我有一个带有静态成员的类 它是一个指针 如下所示 动画 h class Animation public Animation static QString m 动画 cpp include animation h QString Anima
  • 在 C# 中通过 C DLL 使用数组和指针

    我对 C 非常陌生 上周才开始学习 我有一个用 C 编写的自定义 DLL 具有以下函数 DLLIMPORT void test function double test 我想要做的是从 C 获取数组 test 的指针 因此 如果在 DLL
  • Ruby 对象打印为指针

    我正在尝试创建一个类 它有一个带有单个参数的构造函数 当我创建该对象的新实例时 它返回一个指针 class Adder def initialize my num my num my num end end y Adder new 12 p
  • 反对“initialize()”方法而不是构造函数的争论

    我目前负责查找代码库中的所有不良做法 并说服我的同事修复有问题的代码 在我的探索过程中 我注意到这里很多人都使用以下模式 class Foo public Foo Do nothing here bool initialize Do all
  • 无关的库链接

    我有一个可能有点愚蠢的问题 因为我很确定我可能已经知道答案了 假设你有静态库A 动态共享库B和你的linux下的程序C 假设库 A 调用库 B 中的函数 并且您的程序调用库 A 中的函数 现在假设 C 在 A 中调用的所有函数都不使用 B
  • 如何安全地将对象(尤其是 STL 对象)传入和传出 DLL?

    如何将类对象 尤其是 STL 对象 传入和传出 C DLL 我的应用程序必须以 DLL 文件的形式与第三方插件交互 并且我无法控制这些插件是使用什么编译器构建的 我知道 STL 对象没有保证的 ABI 并且我担心这会导致我的应用程序不稳定
  • C 或 C++ 中未初始化的指针有用途吗?

    在其中一篇评论中这个问题 https stackoverflow com questions 1910832 c why arent pointers initialized with null by default 有人指出默认初始化 C
  • 发送WM_SETTEXT时如何避免EN_CHANGE通知?

    我有一个 CEdit 派生控件 当基本数据为空时 该控件显示字符串 N A 我最近添加了代码 以在控件获得焦点时清空控件 SetWindowText 并在用户离开焦点时将其设置回 N A SetWindowText N A 控空 唯一的问题
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call

随机推荐

  • 1.1 cout/cin/函数 练习

    1 1 cout cin 函数 练习 1 程序 Author may Date 2017 04 21 Function 输入输出 cin cout 练习 函数练习 include
  • (java 基础知识)java序列化和反序列话总结

    序列化 将java对象转换为字节序列的过程叫做序列化 反序列化 将字节对象转换为java对象的过程叫做反序列化 通常情况下 序列化有两种用途 1 把对象的字节序列永久的保存在硬盘中 2 在网络上传输对象的字节序列 相应的API java i
  • 6_sleuth-zipkin-spring_boot_admin 链路追踪

    文章目录 Sleuth zipkin SpringBootAdmin 邮件通知 钉钉通知 如果能跟踪每个请求 中间请求经过哪些微服务 请求耗时 网络延迟 业务逻辑耗时等 我们就能更好地分析系统瓶颈 解决系统问题 Sleuth span 跨度
  • 软件人才从这里飞翔——访北京大学软件学院院长陈钟博士

    还是春寒料峭的季节 一年一度的研究生招生工作正在紧张进行中 从北京大学软件学院传出消息 虽然今年招生人数较多 但生源仍然非常充足 现在软件学院软件工程硕士研究生的报考人数已经是北京大学最集中报考的几个专业之一 所以 今年报考北大软件学院的难
  • C标准时间与时间戳的相互转换

    什么是时间戳 时间戳是指格林威治时间自1970年1月1日 00 00 00 GTM 至当前时间的总秒数 它也被称为Unix时间戳 Unix Timestamp 时间戳是能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据 通常是一个
  • Python 16.OpenCV 腐蚀,膨胀,开运算, 闭运算,礼帽,黑帽

    import cv2 import numpy as np img cv2 imread pic7 PNG 0 img1 cv2 imread pic8 PNG 0 img2 cv2 imread pic9 PNG 0 kernel np
  • CISSP一次通过指南(文末附福利)

    CISSP相关资料 考试机构的复习题 中英文教材 思维导图 点击文章末尾卡片 扫描二维码加我耗油免费领取资料哦 CISSP 英文全称 Certified Information Systems Security Professional 中
  • 网页参考资料

    1 w3school 2 蓝色理想 http www blueidea com 3 web前端开发 http www candoudou com
  • 福禄克铜缆测试参数:近端串扰和远端串扰参数之间的区别

    串扰指的是网线在传输网络信号中 产生了彼此的互相干扰 严重的时候会影响到网络传输得质量 网线的双绞程度越紧密 绞距越均匀时 其抗干扰的能力也会越强 且内部的串扰也会越小 在长距离网络传输中 效果也就越好 串扰会对具体的一对导线或整根电缆形成
  • linux 文件扫描程序 性能,Linux性能优化(三)——sysstat性能监控工具

    一 sysstat简介 1 sysstat简介 sysstat提供了Linux性能监控工具集 包括sar sadf mpstat iostat pidstat等 用于监控Linux系统性能和使用情况 iostat 提供CPU统计 存储I O
  • MFC异形对话框

    基本原理 获取窗体区域 指定一个颜色为透明色 遍历位图 将图上所有该色区域从窗体区域中去除 这样最后就得到了一个异形窗体 然后把背景图绘制在该窗体上 注意绘制的时候 作为透明的部分依然会被以原色绘制 但是由于绘制的地方并没有窗体 故而是显示
  • Java用链表实现队列

    链表实现队列 public class LinkedQueue class Node int val Node next public Node int val this val val public Node int val Node n
  • JQuery全部过滤选择器详细介绍上

    文章目录 JQuery全部过滤选择器详细介绍 上 基础过滤选择器 基础过滤选择器介绍 基础过滤选择器 应用实例 代码演示 内容过滤选择器 内容过滤选择器应用实例 代码演示 可见度过滤选择器 可见度过滤选择器 应用实例 代码演示 JQuery
  • 解决position:sticky元素有父盒子时不生效的问题

    当使用粘性定位的盒子出现 当滚动条滚动一段距离有效 然后就跟着滚动条滚出视口 不起作用了 要考虑看你是否设置了 html body height 100 这个代码会影响html和body的高度 不是整个视口的高度 参考 彻底理解粘性定位 p
  • Python期末大作业(学生成绩管理系统)

    学生成绩管理系统共分为五个主要功能 1 用户登陆和注册模块和退出 a 注册存入文件中 见文件 账号密码 csv b 用户登陆在文件中进行查询 见文件 账号密码 csv c 退出可以退出程序 2 新增学生数据 a 通过录入学生的姓名 学号 科
  • Thinkphp5进阶——02 日志

    1 存储位置 index php入口文件定义一个常量LOG PATH log php配置文件的path定义为常量LOG PATH index php 日志目录 define LOG PATH DIR log log php return 日
  • Vue使用Echarts在父子组件中传值问题

    最近项目上需要使用到Echarts做数据可视化 在写项目过程中发现在子组件中通过Echarts点击事件传值给父组件不起作用 研究了一下 发现是作用域问题 解决方法如下 原代码 通过保存外部作用域this得以解决 修改后代码
  • 刷题day68:零钱兑换

    题意描述 给你一个整数数组 coins 表示不同面额的硬币 以及一个整数 amount 表示总金额 计算并返回可以凑成总金额所需的 最少的硬币个数 如果没有任何一种硬币组合能组成总金额 返回 1 你可以认为每种硬币的数量是无限的 完全背包思
  • 一图曝光互联网大佬高考分数,厉害了

    往 期 趣 闻 程序员生日送什么蛋糕好 每日趣闻 人间真实 Java 版 后浪 每日趣闻 如何鉴别 996 公司 每日趣闻 一图读懂程序员 35 岁怎么转型 每日趣闻 程序员的难 领导不懂 每日趣闻 你点的每个 在看 我都认真当成了喜欢
  • How to resolve '_DllMain@12 already defined in xxx.obj' ?

    转自 http blog csdn net psusong article details 5858388 用Visual C 编写DLL 如果在new project时选了MFC DLL 而后又想写成Regular DLL 即拥有自己的D