Inconsistent dll linkage ошибка

Не понимаю откуда столько warnings?

Примерный код:

#ifdef MYDLL_EXPORTS
    #define MYDLL_API __declspec(dllexport)
#else
    #define MYDLL_API __declspec(dllimport)
#endif

class Child
{
public:
    void func();
    // еще куча методов...
};

class MYDLL_API Parent
{
public:
    Child child;
    void somefunc();
    // еще куча методов...
};

void Parent::somefunc()
{
}

В результате компиляции в VSC++7.0 получаю примерно следующее

warning C4273: 'Parent::somefunc' : inconsistent dll linkage
.. // еще куча подобных warnings

Как «убрать» эти warnings?

«moscan» <51783@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1777057@news.rsdn.ru…
> Не понимаю откуда столько warnings?
>
> Примерный код:
>
>

> #ifdef MYDLL_EXPORTS
> #define MYDLL_API __declspec(dllexport)
> #else
> #define MYDLL_API __declspec(dllimport)
> #endif
> 
> class Child
> {
> public:
> void func();
> // еще куча методов...
> };
> 
> class MYDLL_API Parent
> {
> public:
> Child child;
> void somefunc();
> // еще куча методов...
> };
> 
> void Parent::somefunc()
> {
> }
>


>
> В результате компиляции в VSC++7.0 получаю примерно следующее
>
>

> warning C4273: 'Parent::somefunc' : inconsistent dll linkage
> .. // еще куча подобных warnings
>


>
> Как «убрать» эти warnings?

Это означает, что в той точке, в которой определяется функция Parent::somefunc объявление класса Parent выглядит как __declspec(dllimport). Вот компилятор и жалуется на противоречие: ему сказали, что функции этого класса определены в другом модуле (__declspec(dllimport)) и, тем не менее их определение дается в этом модуле.
Чтобы устранить эти ошибки (хоть они и выглядят как предупреждения, на самом деле это — ошибки), нужно проверять объявление и подключение макроса MYDLL_API

Posted via RSDN NNTP Server 2.0


C++ уже затем учить надо, что он ум в порядок приводит. (с) Ломоносов М.В.

How can I remove this link warning? You can see code segment that causes this warning.

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
    }

warning C4273: ‘InitGuiCtrlsDLL’ : inconsistent dll linkage

I have also export and import definitions, like:

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

Enlico's user avatar

Enlico

23.5k6 gold badges48 silver badges104 bronze badges

asked Apr 7, 2010 at 12:51

baris.aydinoz's user avatar

baris.aydinozbaris.aydinoz

1,9002 gold badges18 silver badges28 bronze badges

The purpose of the preprocessor statements:

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

is to make sure that the header file declares the class or function as __declspec(dllexport) in the .dll where it is defined, and as __declspec(dllimport) for any other .dll that might want to use it.

For this to work, _GUICTRLS must be defined when compiling the exporting .dll, and not defined for any other .dll. Generally you would expect _GUICTRLS to be defined in the project properties, under C/C++ -> Preprocessor -> Preprocessor Definitions.

The compiler error you are seeing usually happens because either _GUICTRLS is not defined for the project that is doing the export, or it is defined for multiple projects, usually resulting from cutting an pasting from one project to another. You will also see this if _GUICTRLS is defined in a header file that is included in multiple projects.

answered May 12, 2010 at 20:33

Eric Thompson's user avatar

In addition to reading the warning message, pay attention to where it occurs if you have multiple projects as part of a workspace.

I wasted time looking for a problem in my DLL which was compiling and linking correctly. The workspace was also building the main application and my error was that I had inadvertently included a new (DLL) source file into the build file list of the application itself.

The main program requires the DLL header mynewdll.h to import things but does not require the source file mynewdll.cpp. (The code is brought in at run time with a DLL.) I have a habit of including header and code files into projects as a pair, and this is where I had gone wrong.

I would have detected the error much sooner if I had been alert and noticed that the DLL project linked with no errors and it was the main program that complained!

My DLL source code and project was error free and it was only the way I tried to build my executable that was faulty.

answered May 11, 2015 at 10:11

Ivan's user avatar

IvanIvan

4,42336 silver badges27 bronze badges

That warning is usually caused by a duplicate definition of a function with different use of dllimport. Are you sure you didn’t do this?

answered Apr 7, 2010 at 13:50

Matteo Italia's user avatar

Matteo ItaliaMatteo Italia

124k17 gold badges207 silver badges300 bronze badges

1

[ CMake inconsistent dll linkage ]

I encountered the following issue + solution with the __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") 

This was annoying because a number of sources say to use the ‘set source file properties’ command to get better granularity but the doc is not clear on what happens to file1.h’s declares when included from a different directory… better stick with add_definitions( -DMYLIB=1 ) for now!

To catch this problem: in your Foo.cpp file:

#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 
{ 
};

answered Sep 3, 2014 at 7:35

peter karasev's user avatar

peter karasevpeter karasev

2,5781 gold badge28 silver badges38 bronze badges

See that you are not defining the exported symbols in a different project. Also clean all the intermediate files by hand and recompile.

answered Mar 16, 2013 at 8:29

damian's user avatar

To elaborate the answer of damian with an example. I read it but didn’t understand at first glance.

You have a shared library with a source file compiled in that contains the function. In a new project you use the library and in addition you compile also the source file to use the function (I forgot that it is already in the library). Within the library the functions label is exported, within the additional compiled source file the functions label is marked to be imported. That’s the conflict.

answered May 8, 2022 at 8:19

Ingo's user avatar

IngoIngo

5869 silver badges21 bronze badges

In my case, error C4273 was caused by trying linking to .lib file from a DLL dynamic load tester app in Qt5 by msvc2017_64 toolchain. Removing the reference to .lib file by changing LIBS setting in .pro file have the problem solved.

answered Jan 24, 2020 at 15:46

StndFish's user avatar

1

Epic Developer Community Forums

Loading

  • Remove From My Forums
  • Question

  • My code is producing this:

    «d:\…\createsampleproject.cpp(11) : warning C4273: ‘CreateSampleProject::CreateSampleProject’ : inconsistent dll linkage»

    When I look at the line of source referred to, I see:

    #ifdef CREATEPRJ_EXPORTS


    #define CREATEPRJ_API __declspec(dllexport)

    #else

    #define CREATEPRJ_API __declspec(dllimport)

    #endif

    How can I solve that problem?

Answers

  • Thank you, I changed it to

    #define DllExport __declspec(dllexport)

    #define DllImport __declspec(dllimport)

    and now it works.

  • Yes, that can work.

    Another possibility is to #define CREATEPRJ_EXPORTS in the DLL and not define it in users of the DLL. Right?

>
Как понимать предупреждение

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,

    Senior Member

    ****

    Рейтинг (т): 9

    warning C4273: ‘InstallWinIoDriver’ : inconsistent dll linkage. dllexport assumed.
    ниже перевод( мой)
    непоследовательное{противоречивое} dll редактирование. dllexport принятый.
    Я получаю такое предупреждение при линковке и ,хотя программа собирается, но не делает того что я ожидаю.
    В поиске нашел ответ от ADIL
    При создании DLL должно быть dllexport, а не dllimport, о чем и сообщает компилятор:

    Но я не делаю dll она прилагается

    ExpandedWrap disabled

      #include <windows.h>

      #include <stdio.h>

      #include <stdlib.h>

      #include «WinIo.h»

      bool _stdcall InstallWinIoDriver

       (

         PSTR pszWinIoDriverPath,      

         bool IsDemandLoaded          

       );                                

      void main()

      {

      InstallWinIoDriver(«c:\\WinIo.sys»,false);

      if(InstallWinIoDriver(«c:\\WinIo.sys»,false))

      printf(«%s»,»Instal complecte»);

      }

    ___________

    Сообщение отредактировано: oksman


    BlackEmperor



    Сообщ.
    #2

    ,

      В общем сообщение о кривой линковке (сборке, один и моих бывших преподов ВУЗа, прибил бы меня за слово «линковка» :) — лирическое отступление :) )
      А вообще мало информации для ответа, что собирается на каком компилере, с какими либами и т.д. …


      oksman



      Сообщ.
      #3

      ,

        Senior Member

        ****

        Рейтинг (т): 9

        Цитата BlackEmperor @

        В общем сообщение о кривой линковке (сборке, один и моих бывших преподов ВУЗа, прибил бы меня за слово «линковка» :) — лирическое отступление :) )
        А вообще мало информации для ответа, что собирается на каком компилере, с какими либами и т.д. …

        Спасибо за ответ.
        Собирается вышеприведенная программа для инсталляции драйвера WinIo под XP.
        IDE Visual C++ 6.5. Линкуется с WinIo.lib. Все строго по инструкции, прилагаемой к программе.
        P.S Что плохого в слове линковка :)
        P.P.S Как можно узнать установился ли драйвер в систему?

        Сообщение отредактировано: oksman


        MinLexx



        Сообщ.
        #4

        ,

          Цитата BlackEmperor @

          При создании DLL должно быть dllexport

          При создании DLL?? А тип проекта какой? Вы DLL делаете или EXE?


          oksman



          Сообщ.
          #5

          ,

            Senior Member

            ****

            Рейтинг (т): 9

            Цитата MinLexx @

            Цитата BlackEmperor @

            При создании DLL должно быть dllexport

            При создании DLL?? А тип проекта какой? Вы DLL делаете или EXE?

            EXE :o


            MinLexx



            Сообщ.
            #6

            ,

              А _stdcall обязательно нужно? :huh:
              Что в WinIo.h?

              Цитата MSDN

              ‘function’ : inconsistent DLL linkage
              Two definitions in a file differ in their use of dllimport.
              The following sample generates C4273:
              // C4273.cpp
              // compile with: /W1
              char __declspec(dllimport) c;
              char c; // C4273, delete this line or the line above to resolve

              int main()
              {
              }

              Два определения в файле отличаются друг от друга (один с dllimport, другой с dllexport например)

              Думается, проблема в WinIo.h, в котором объявлена InstallWinIoDriver как-то по-другому? :blink:


              Adil



              Сообщ.
              #7

              ,

                А надо ли вообще объявлять прототип InstallWinIoDriver? В «WinIo.h» его разве нет?


                oksman



                Сообщ.
                #8

                ,

                  Senior Member

                  ****

                  Рейтинг (т): 9

                  Цитата Adil @

                  А надо ли вообще объявлять прототип InstallWinIoDriver? В «WinIo.h» его разве нет?

                  Adil Спасибо.
                  Проверю. Прототип объявил на автопилоте :)

                  Два определения в файле отличаются друг от друга (один с dllimport, другой с dllexport например)

                  Думается, проблема в WinIo.h, в котором объявлена InstallWinIoDriver как-то по-другому?

                  MinLexx Спасибо.Проверю. :)

                  P.S Как можно узнать установился ли драйвер в систему, кроме тестирования программы на железе?

                  Сообщение отредактировано: oksman


                  oksman



                  Сообщ.
                  #9

                  ,

                    Senior Member

                    ****

                    Рейтинг (т): 9

                    Цитата Adil @

                    А надо ли вообще объявлять прототип InstallWinIoDriver? В «WinIo.h» его разве нет?

                    Adil Еще раз спасибо.
                    Предупреждений нет :)

                    Но при попытке исполнить простой тест

                    ExpandedWrap disabled

                      #include <windows.h>

                      #include <stdio.h>

                      #include <stdlib.h>

                      #include «WinIo.h»

                      DWORD *a;                        

                      void main()

                      {

                      InstallWinIoDriver(«c:\\WinIo.sys»,false);

                      if(InstallWinIoDriver(«c:\\WinIo.sys»,false))

                      printf(«%s»,»Instal complecte»);

                       InitializeWinIo();

                      if(InitializeWinIo())

                      printf(«%s»,»Init complecte»);

                       SetPortVal(278,15,1);                        

                       GetPortVal(278,a,1);

                      printf(«%d»,a);

                      }

                    получаю
                    Instal complecte
                    0
                    что свидетельствует ИМХО о том, что функция InitializeWinIo()
                    не завершилась успешно.Все делаю по инструкции к пакету WinIo.
                    Где я неправ? Может не вижу чего то очевидного.


                    UncleBob



                    Сообщ.
                    #10

                    ,

                      Вообще, достаточно странный код. я бы убрал несколько строк…

                      ExpandedWrap disabled

                        void main()

                        {

                        // эту //InstallWinIoDriver(«c:\\WinIo.sys»,false);

                        if(InstallWinIoDriver(«c:\\WinIo.sys»,false))

                        printf(«%s»,»Instal complecte»);

                        // и эту //InitializeWinIo();

                        if(InitializeWinIo())

                        printf(«%s»,»Init complecte»);

                         SetPortVal(278,15,1);                        

                         GetPortVal(278,a,1);

                        printf(«%d»,a);

                        }

                      Добавлено

                      Цитата oksman @

                      GetPortVal(278,a,1);

                      Так делать нельзя, запись по неинициализированному указателю.

                      ExpandedWrap disabled

                        DWORD a;

                        GetPortVal(278,&a,1);


                      oksman



                      Сообщ.
                      #11

                      ,

                        Senior Member

                        ****

                        Рейтинг (т): 9

                        Цитата Uncle_Bob @

                        Так делать нельзя, запись по неинициализированному указателю.

                        ExpandedWrap disabled

                          DWORD a;

                          GetPortVal(278,&a,1);

                        Большое спасибо :)
                        Согласен,что по п1.код излишний,по п2 явная ошибка.
                        Но проблема то в том, что

                        ExpandedWrap disabled

                          if(InstallWinIoDriver(«c:\\WinIo.sys»,false))

                          printf(«%s»,»Instal complecte»);

                        исполняется( и в реестре прописана и winio.sys в папке драйверов есть)
                        а функция

                        ExpandedWrap disabled

                          if(InitializeWinIo())

                          printf(«%s»,»Init complecte»);

                        в 6 студии не исполняется вообще т.е.
                        Init complecte я не вижу.
                        При компиляции в 7.1 студия не дает мне увидеть, что произошло(мелькнул экран и все)
                        Но порт не реагирует :o
                        Как в 7.1 студии увидеть результат?( поставил только два дня как, еще осваиваюсь :o )
                        Кстати , столкнулся с непонятным явлением.
                        В 98 по ,старту системы, порт 0x278 встает в 8( я потом его сам обнуляю либо этот бит не подключаю)
                        а в XP по старту встает в 255 :ну и не управляется пока у меня никак :o
                        MinLexx
                        Спасибо за цитату MSDN .Перевел.
                        Русским языком сказано » Двойное определение функции — удалите эту строку» :)

                        Сообщение отредактировано: oksman


                        UncleBob



                        Сообщ.
                        #12

                        ,

                          Цитата oksman @

                          в 6 студии не исполняется вообще

                          Видимо, все-таки исполняется, но возвращает false ;)

                          Остается продиагностировать проблему. Есть какой-нибудь вызов для получения кода ошибки? Я с WinIo не знаком.


                          oksman



                          Сообщ.
                          #13

                          ,

                            Senior Member

                            ****

                            Рейтинг (т): 9

                            Цитата Uncle_Bob @

                            Цитата oksman @

                            в 6 студии не исполняется вообще

                            Видимо, все-таки исполняется, но возвращает false ;)

                            Остается продиагностировать проблему. Есть какой-нибудь вызов для получения кода ошибки? Я с WinIo не знаком.

                            Согласен.Неточно выразился. :)
                            К сожалению кодов ошибок в WinIo нет.
                            Единственное, что нашел в хелпе (перевод мой)

                            ExpandedWrap disabled

                              InitializeWinIo

                              Эта функция инициализирует WinIo библиотеку.

                              bool _stdcall InitializeWinIo();

                              Параметры:

                              Нет

                              Возвращаемые значения:

                               При нормальном завершении, функция возвращает true. Иначе возвращает false.

                              Замечания:

                              Функцию InitializeWinIo следует вызывать перед использованием любой другой функции  библиотеки.

                              Обратите внимание:

                              • Нет необходимости  вызывать функцию InitializeWinIo перед вызовом функций InstallWinIoDriver  и  RemoveWinIoDriver.

                              • Под Windows NT / 2000/xp, вызванная InitializeWinIo предоставляет приложению полный доступ к адресному пространству ввода — вывода. После вызова функции, приложение может свободно использовать функции _inp/_outp, обеспеченные C библиотекой во время выполнения, чтобы обращаться к портам ввода — вывода  системы.

                            Что еще выяснил:
                            С пакетом идет пример

                            ExpandedWrap disabled

                              void main()

                              {

                                DWORD dwPortVal;

                                DWORD dwMemVal;

                                bool bResult;

                                HANDLE hPhysicalMemory;

                                PBYTE pbLinAddr;

                                // Call InitializeWinIo to initialize the WinIo library.

                                bResult = InitializeWinIo();

                                if (bResult)

                                {

                                  // Under Windows NT/2000/XP, after calling InitializeWinIo,

                                  // you can call _inp/_outp instead of using GetPortVal/SetPortVal

                                printf(» Initialization  WinIo.\n»);// Это я добавил для контроля

                                  GetPortVal(0x378, &dwPortVal, 4);

                                  SetPortVal(0x378, 10, 4);

                                    // When you’re done using WinIo, call ShutdownWinIo

                                  ShutdownWinIo();

                                }

                                else

                                {

                                  printf(«Error during initialization of WinIo.\n»);

                                  exit(1);

                                }

                              }

                            Так он исполняется 1-2 раза из 20 :o
                            Ничего не могу понять :(
                            P.S.А как в 7 студии посмотреть результать исполнения?. Экран мелькнул и все.
                            P.P.S. Ничего не делал,ничего не менял, вдруг заработала :D
                            Извини за напряг

                            Сообщение отредактировано: oksman

                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                            0 пользователей:

                            • Предыдущая тема
                            • Visual C++ / MFC / WTL
                            • Следующая тема

                            [ Script execution time: 0,0447 ]   [ 16 queries used ]   [ Generated: 21.09.23, 11:57 GMT ]  

                            Понравилась статья? Поделить с друзьями:
                          • Incoming client packet has caused exception starbound ошибка
                          • Including corrupted data ошибка принтера xerox phaser
                          • Imax b6ac connection break ошибка
                          • Imax b6 mini ошибки
                          • Imap ошибка протокола tls неверная запись mac decryptmissingdatabytes