"error LNK2005: _DllMain@12 already defined"的解决办法

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

 error LNK2005: _DllMain@12 already defined in xxx.OBJ

 

这是因为_USRDLL和_AFXDLL发生冲突所致。

 

几种解决方案:

1, 你只需要在工程设置里面,把

WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL

中的_USRDLL,删除,就可以正确编译了

2,http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652

RESOLUTION There are two ways to resolve this problem. The first solution involves forcing the linker to link the libraries in the correct order. The second solution allows you to find the module that is causing the problem and to correct it.

Note The following steps are based on Visual C++ 6.0. Back to the top

Solution One: Force Linker to Link Libraries in Correct Order 1. On the Project menu, click Settings. 2. In the Settings For view of the Project Settings dialog box, click to select the project configuration that is getting the link errors. 3. On the Link tab, click to select Input in the Category combo box. 4. In the Ignore libraries box, insert the library names (for example, Nafxcwd.lib;Libcmtd.lib).

Note The linker command-line equivalent in /NOD:<library name>. 5. In the Object/library modules box, insert the library names. You must make sure that these are listed in order and as the first two libraries in the line (for example, Nafxcwd.lib Libcmtd.lib). To set this option in Visual C++ .NET, read the "Setting Visual C++ Project Properties" online help topic. Back to the top

Solution Two: Locate and Correct the Problem Module To view the current library link order, follow these steps: 1. On the Project menu, click Settings. 2. In the Settings For view of the Project Settings dialog box, click to select the project configuration that is getting the link errors. 3. On the Link tab, type /verbose:lib in the Project Options box. 4. Rebuild your project. The libraries will be listed in the output window during the linking process.

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 :-)

### Vue 项目中百度地图商用授权解决方案 在开发基于 Vue 的应用并集成百度地图时,如果遇到商用授权问题,可以按照以下方法来解决。 #### 关闭 JSAPI 商用授权挂件 当不需要使用商用功能时,可以在初始化百度地图插件时显式关闭该选项: ```javascript mounted() { // 百度地图初始化 BaiduMap.init().then((BMap) => { console.log(BMap); console.log("加载成功..."); // 创建地图实例,并禁用商用授权标志 let map = new BMap.Map("container", { enableBizAuthLogo: false, // 明确设置为false以关闭商用授权提示 }); }); } ``` 此配置项 `enableBizAuthLogo` 默认情况下是开启的,将其设为 `false` 可有效去除页面上显示的“JS API 商业化产品”的水印[^1]。 #### 获取正式商用授权 对于确实需要使用高级特性的场景,则应当申请官方提供的正式商用授权。这通常涉及以下几个方面的工作: - 访问百度地图开放平台官网注册账号; - 提交企业资质审核材料完成实名认证流程; - 购买适合业务需求的服务套餐获取密钥(AK); - 将所得到的应用秘钥正确填入到项目的相应位置以便合法调用接口。 通过上述途径取得有效的 AK 后,在代码中的引入方式如下所示: ```html <script type="text/javascript" src="//api.map.baidu.com/api?v=3.0&ak=您的密钥"></script> ``` 确保每次请求都携带正确的访问令牌,从而保障服务稳定性和数据安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值