46

如何删除此链接警告?您可以看到导致此警告的代码段。

static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };
//bla bla
// Exported DLL initialization is run in context of running application
    extern "C" void WINAPI InitGuiCtrlsDLL()
    {
     // create a new CDynLinkLibrary for this app
      new CDynLinkLibrary(GuiCtrlsDLL);
     // nothing more to do
    }

警告 C4273:“InitGuiCtrlsDLL”:不一致的 dll 链接

我也有导出和导入定义,例如:

#ifdef _GUICTRLS
   #define GUI_CTRLS_EXPORT __declspec(dllexport)
#else
   #define GUI_CTRLS_EXPORT  __declspec(dllimport)
#endif
4

7 回答 7

54

预处理器语句的目的:

#ifdef _GUICTRLS 
   #define GUI_CTRLS_EXPORT __declspec(dllexport) 
#else 
   #define GUI_CTRLS_EXPORT  __declspec(dllimport) 
#endif 

是确保头文件在定义它的 .dll 中将类或函数声明为 __declspec(dllexport),并为可能想要使用它的任何其他 .dll 声明为 __declspec(dllimport)。

为此,必须在编译导出的 .dll 时定义 _GUICTRLS,而不是为任何其他 .dll 定义。通常,您希望 _GUICTRLS 在项目属性中定义,位于 C/C++ -> Preprocessor -> Preprocessor Definitions 下。

您看到的编译器错误通常是因为没有为正在执行导出的项目定义_GUICTRLS,或者它是为多个项目定义的,通常是由于将粘贴从一个项目剪切到另一个项目。如果 _GUICTRLS 在包含在多个项目中的头文件中定义,您也会看到这一点。

于 2010-05-12T20:33:36.733 回答
27

有多种可能性:

1)static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };

您使用 AFX_EXTENSION_MODULE。这意味着您正在实现一个 MFC 扩展 DLL。对于此类扩展 dll,您必须定义预处理器 _AFXEXT。在 Visual C++ 项目的 C++ 编译器设置中进行设置

看:

如何在 MFC 扩展 DLL 中使用 _declspec(dllexport):http: //support.microsoft.com/kb/128199

AFX_EXTENSION_MODULE 结构:http: //msdn.microsoft.com/en-us/library/sxfyk0zk.aspx

TN033:MFC 的 DLL 版本:http: //msdn.microsoft.com/en-us/library/hw85e4bb.aspx

2) 您可能有重复的定义/声明。

于 2011-01-14T14:32:10.493 回答
4

除了阅读警告消息之外,如果您有多个项目作为工作空间的一部分,请注意它出现的位置。

我浪费时间在我的 DLL 中寻找正确编译和链接的问题。工作区也在构建主应用程序,我的错误是我无意中将一个新的 (DLL) 源文件包含在应用程序本身的构建文件列表中

主程序需要 DLL 头文件 mynewdll.h 来导入东西,但不需要源文件 mynewdll.cpp。(代码是在运行时通过 DLL 引入的。)我习惯将头文件和代码文件作为一对包含到项目中,这就是我出错的地方。

如果我一直保持警觉并注意到 DLL 项目链接没有错误并且它是抱怨的主程序,我会更快地检测到错误!

我的 DLL 源代码和项目没有错误,只是我尝试构建可执行文件的方式有问题。

于 2015-05-11T10:11:28.630 回答
2

该警告通常是由具有不同使用 dllimport 的函数的重复定义引起的。你确定你没有这样做吗?

于 2010-04-07T13:50:15.670 回答
2

[CMake不一致的dll链接]

我遇到了 __declspec(dllexport) + __declspec(dllimport) 的以下问题+解决方案:

# # #CMakeLists.txt
add_defintions(-DMYLIB=1)
# The above was the solution...
#    (MYLIB is used in the standard ifdef + define MYLIB_EXPORT syntax)
#  Below: seems to get overruled by other directory's headers: 
set_source_files_properties(  file1.h  file2.h  COMPILE_FLAGS "-DMYLIB=1") 

这很烦人,因为许多消息来源说要使用“设置源文件属性”命令来获得更好的粒度,但是文档不清楚从不同目录中包含 file1.h 的声明时会发生什么……最好坚持使用add_definitions( -DMYLIB=1 ) for现在!

要解决这个问题:在您的 Foo.cpp 文件中:

#include "export.h"
#if defined(MYLIB)
#if defined(OTHERLIB)
  static_assert(0,"error, check your definitions!");
  // OTHER depends on MY; can't have both of these flags being set!
#endif
#endif
struct  OTHER_EXPORT  foo 
{ 
};
于 2014-09-03T07:35:21.050 回答
0

请注意,您没有在不同的项目中定义导出的符号。还要手动清理所有中间文件并重新编译。

于 2013-03-16T08:29:50.233 回答
0

在我的情况下,错误 C4273 是由 msvc2017_64 工具链尝试从 Qt5 中的 DLL 动态负载测试器应用程序链接到 .lib 文件引起的。通过更改 .pro 文件中的 LIBS 设置删除对 .lib 文件的引用即可解决问题。

于 2020-01-24T15:46:17.650 回答