ошибка C2375: переопределение; другая связь - PullRequest
4 голосов
/ 09 сентября 2010

Ошибка место в API:

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int CAnyseeUSBTVControllerDlg::InitCaptureDevice()
{

В моем классе библиотеки .h и определение функции:

class CAnyseeUSBTVControllerDlg : public CDialog
{
// Construction
public:
    int InitCaptureDevice(void);

Есть идеи, как ее решить?

"Ошибка 1 ошибка C2375: 'CAnyseeUSBTVControllerDlg :: InitCaptureDevice': переопределение; различная связь c: \ Program Files \ toATS_DVS \ anysee \ anyseee30 \ anyseee30 \ anyseeUSBTVControllerDlg.cpp 122 anyseee30"

Ответы [ 5 ]

6 голосов
/ 09 сентября 2010

Вы должны убедиться, что вы используете ту же декларацию в заголовочном файле. В противном случае это рассматривается как разные методы.

class CAnyseeUSBTVControllerDlg : public CDialog
{
// Construction
public:
    int InitCaptureDevice(void);
    DLLEXPORT int CaptureDevice(void);

См. Использование dllimport и dllexport в классах C ++

2 голосов
/ 17 марта 2015

Это может произойти, потому что

  1. Вы определили прототип функции в разных местах с помощью различная видимость (extern против static)
  2. То же, что и выше, но искажение другого имени (extern "C" против extern "C++")
  3. То же, что и выше, но другой экспорт dll (__declspec(dllimport) против __declspec(dllexport)).

Чтобы решить эту проблему, включите / p для файлов, чтобы увидеть, как они обрабатываются предварительно (это должно быть в каждом отдельном файле и прекратит генерировать .obj для этого файла), найдите файл .i с результатом.

Или используя / displayinclude, или просто просматривая код.

1 голос
/ 09 сентября 2010

С http://tldp.org/HOWTO/C++-dlopen/thesolution.html

C ++ имеет специальное ключевое слово для объявления функции с привязками C: extern "C".Функция, объявленная как extern «C», использует имя функции в качестве имени символа, так же, как функция C.По этой причине только внешние функции могут быть объявлены как внешние "C", и они не могут быть перегружены.

Я полагаю, что статические члены также могут быть доступны для extern "C", но вы можетеделать то, что вы пытаетесь сделать напрямую.Вам нужно будет создать интерфейс-обертку только для C, которая будет вызывать функции-члены вашего класса.Затем вы можете extern "C" обертки и выставить это вне вашей DLL.

1 голос
/ 09 сентября 2010

Нельзя указывать DLLEXPORT в файле .cpp, но нельзя указывать в заголовочном файле (поскольку в противном случае компилятор обрабатывает эти функции как разные).

Сделайте свое определение также DLLEXPORT.

0 голосов
/ 15 апреля 2017
//foo.h

#pragma once
#ifdef FOO_EXPORTS
#define FOO_API __declspec(dllexport)
#else
#define FOO_API __declspec(dllimport)
#endif

namespace foo
{
    class Baz
    {
    public:
        FOO_API static auto say_hello() -> void;
    };
}

Ключевым моментом, не столько именами функций или моим использованием конечного возвращаемого типа, является то, что вы помещаете имя #defined __declspec перед функцией, которую вы хотите экспортировать, так же, как вы делаете тип .

Вы также сделаете то же самое в определении функции:

//foo.cpp

#include "foo.h"

namespace foo 
{
    FOO_API auto Baz::say_hello() -> void
    {
        do 
        { 
            MessageBox(nullptr, L"Seems to be working okay!", L"OK", MB_OK); 
            exit(1); 
        } 
        while (0);
     }
}

Реализация функции не важна, просто вы ставите FOO_API впереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...