代码之家  ›  专栏  ›  技术社区  ›  baris.aydinoz

关于不一致的dll链接

  •  36
  • baris.aydinoz  · 技术社区  · 14 年前

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

    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”:不一致 T DLL联动

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

    #ifdef _GUICTRLS
       #define GUI_CTRLS_EXPORT __declspec(dllexport)
    #else
       #define GUI_CTRLS_EXPORT  __declspec(dllimport)
    #endif
    
    6 回复  |  直到 8 年前
        1
  •  18
  •   Gökhan Akca    14 年前

    有多种可能性:

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

    您使用AFX扩展模块。这意味着您正在实现一个MFC扩展DLL。对于这样的扩展DLL,您必须定义预处理器_afxext。将此设置在VisualC++项目的C++编译器设置中

    见:

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

    (目前我不能发布超过1个链接,因为我的声誉低于10个。稍后我将添加两个更重要的链接。因此,如果这是解决方案,请将其标记为加快进程的答案;)

    正如所承诺的,这里有两个链接:

    AFX扩展模块结构: http://msdn.microsoft.com/en-us/library/sxfyk0zk.aspx

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

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

        2
  •  38
  •   Eric Thompson    14 年前

    预处理器语句的用途:

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

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

    要使其工作,在编译exporting.dll时必须定义guictrls,而不是为任何其他.dll定义guictrls。一般情况下,您可以预期在项目属性中定义了GuigGurrl,在C/C++-GT;预处理器-gt;预处理器定义下。

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

        3
  •  2
  •   Matteo Italia    14 年前

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

        4
  •  1
  •   peter karasev    10 年前

    [cmake不一致的dll链接]

    我在uu declspec(dllexport)+u 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") 
    

    这很烦人,因为很多资料来源说要使用'set source file properties'命令来获得更好的粒度,但是文档不清楚file1.h在从其他目录包含时声明了什么…最好坚持 add_definitions( -DMYLIB=1 ) 现在!

    要捕获此问题,请执行以下操作:在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 
    { 
    };
    
        5
  •  1
  •   Ivan    8 年前

    除了阅读警告消息外,还要注意它发生的位置 如果有多个项目作为工作区的一部分。

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

    主程序需要dll头mynewdll.h来导入内容,但不需要源文件mynewdll.cpp。(代码是在运行时用一个DLL引入的。)我有一个习惯,将头文件和代码文件成对地包含到项目中,这就是我出错的地方。

    如果我保持警惕并注意到DLL项目链接没有错误,并且是主程序投诉的话,我早就检测到错误了!

    我的dll源代码和项目是没有错误的,这是我试图构建可执行文件的唯一方法,但有错误。

        6
  •  0
  •   damian    11 年前

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