移植 C++ 后链接器错误 应用程序从VC6到VS2005

发布于 2024-07-09 10:05:13 字数 197 浏览 8 评论 0原文

我在将应用程序从 VC6 移植到 Visual Studio 2005 时遇到错误。

有人知道这意味着什么吗?

mfcs80.lib(dllmodul.obj):错误 LNK2005:_DllMain@12 已定义 在MSVCRT.lib(dllmain.obj)

I am getting an error while porting my application from VC6 to Visual Studio 2005.

Does anyone have any idea what this means?

mfcs80.lib(dllmodul.obj) : error
LNK2005: _DllMain@12 already defined
in MSVCRT.lib(dllmain.obj)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

贪了杯 2024-07-16 10:05:13

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

CRT 出现 LNK2005 错误
库和 MFC 库链接
Visual C++ 中的顺序错误

因为

CRT 库使用弱外部
新建、删除和删除的链接
Dll主要函数。 MFC 库
还包含 new、delete 和 DllMain
功能。 这些功能需要
之前要链接的 MFC 库
CRT 库已链接。

所以

有两种方法可以解决这个问题
问题。 第一个解决方案涉及
强制链接器链接
库按正确的顺序排列。 这
第二个解决方案可以让你找到
导致问题的模块以及
来纠正它。

任何一个

强制链接器进行链接
正确顺序的库

  1. 在“项目”菜单上,点击“设置”。
  2. 在“项目设置”对话框的“设置”视图中,单击
    选择项目配置
    出现链接错误。
  3. 在“链接”选项卡上,单击以选择“类别”组合框中的“输入”。
  4. 在“忽略库”框中,插入库名称(例如,
    Nafxcwd.lib;Libcmtd.lib)。

    注意 /NOD: 中的链接器命令行等效项。

  5. 在“对象/库模块”框中,插入库名称。 你
    必须确保这些已列出
    按顺序和前两个一样
    行中的库(例如,
    Nafxcwd.lib Libcmtd.lib)。

要在 Visual C++ .NET 中设置此选项,
阅读“设置 Visual C++ 项目
属性”在线帮助主题。

或者

找到并更正
问题模块 查看当前问题
库链接顺序,请遵循这些
步骤:

  1. 在“项目”菜单上,点击“设置”。
  2. 在“项目设置”对话框的“设置”视图中,单击
    选择项目配置
    出现链接错误。
  3. 在“链接”选项卡的“项目选项”中键入 /verbose:lib
    框。
  4. 重建您的项目。 这些库将在输出中列出
    链接过程中的窗口。

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

A LNK2005 error occurs when the CRT
library and MFC libraries are linked
in the wrong order in Visual C++

Because

The CRT libraries use weak external
linkage for the new, delete, and
DllMain functions. The MFC libraries
also contain new, delete, and DllMain
functions. These functions require the
MFC libraries to be linked before the
CRT library is linked.

So

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.

Either

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

  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.

Or

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.
ぇ气 2024-07-16 10:05:13

我确信发生这种情况的原因有很多 - 我发现的最糟糕的一个是当尝试集成许多最初是 DLL 的静态库(我们的)时(事实上,我们将项目构建为 DLL 和 DLL)。静态库)。

我们的 C++/CLI DLL 使用这些库的静态版本(以避免在使用 C++/CLI Dll 时导致 ASP.NET 加载问题的 DLL 依赖问题),并且最初看到相同的链接器错误。

问题原来是使用了 AFX_MANAGE_STATE(AfxGetStaticModuleState()) 宏,当代码构建为 DLL 时需要该宏,但静态库调用实际上并不需要该宏。

为了解决这个问题,我最终将以下代码添加到每个项目的 stdafx.h 中。

#ifdef OMUTILITIES_LINK_STATIC
    #undef AfxGetStaticModuleState
    #define AfxGetStaticModuleState AfxGetModuleState
#endif

当然,这可能不是您的具体问题。 但我最终想到的方法是打开链接器的 /VERBOSE 选项并查看谁、什么、在哪里以及在哪里。 当它拉入运行时库时。 (项目属性/配置属性/链接器/在vs2005中显示进度)

I'm sure there are a number of reason this could happen - the worst one I ever found was when trying to integrate a number of static libraries (ours) that were originally DLLS (in fact, we build the projects as both DLL & static libraries).

Our C++/CLI DLL was using the static versions of these libraries (To avoid DLL dependency issues that were causing ASP.NET loading issues when the C++/CLI Dll was being used) and was initially seeing the same linker error.

The problem turned out to be the use of AFX_MANAGE_STATE(AfxGetStaticModuleState()) macro that was needed when the code was built as a DLL but not actually needed for the static library call.

To solve this i ended up adding the following code to the stdafx.h of each project.

#ifdef OMUTILITIES_LINK_STATIC
    #undef AfxGetStaticModuleState
    #define AfxGetStaticModuleState AfxGetModuleState
#endif

This, of course, may not be your specific problem. But the way i eventually figured it was by turning on the /VERBOSE option for the linker and seeing who, what, where & when it was pulling in the runtime libraries. (Project Properties/Configuration Properties/Linker/Show Progress in vs2005)

此刻的回忆 2024-07-16 10:05:13

您可以设置链接器输入以忽略项目属性中的问题库,但这可能有效,也可能无效。

You could set the linker input to ignore the troubling library in the project properties, but this may or may not work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文