错误C2375:重新定义;不同的联系

时间:2010-09-09 13:47:57

标签: c++ redefinition

在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“

6 个答案:

答案 0 :(得分:6)

您必须确保在头文件中使用相同的声明。否则它被视为不同的方法。

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

请参阅Using dllimport and dllexport in C++ Classes

答案 1 :(得分:2)

这可能是因为

  1. 您在不同的地方定义了函数的原型 不同的可见度(extern vs static
  2. 与上述相同但是 不同的名称修改(extern "C" vs extern "C++"
  3. 与上述相同但不同的dll导出(__declspec(dllimport) vs __declspec(dllexport))。
  4. 要解决,启用/ p文件以查看它们是如何预处理的(这必须是逐个文件的,并且将停止为该文件生成.obj),查找带有结果的.i文件。

    或者使用/ displayincludes,或者只是通过代码进行greping。

答案 2 :(得分:1)

您不能在DLLEXPORT文件中声明.cpp,但不能在头文件中声明(因为否则编译器会将这些函数视为不同的函数)。

还要定义DLLEXPORT

答案 3 :(得分:1)

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

  

C ++有一个特殊的关键字来声明一个   具有C绑定的函数:extern“C”。   声明为extern“C”的函数使用   函数名称为符号名称,只是   作为C函数。因此,只有   可以声明非成员函数   作为外部“C”,他们不可能   超载。

我相信静态成员也可以extern "C",但你不能做你想直接做的事情。您需要创建一个只调用C语言的包装器接口来调用您的类成员函数。然后,您可以extern "C"包装器并在DLL外部公开它。

答案 4 :(得分:0)

//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放在前面。

答案 5 :(得分:0)

今天我遇到了同样的问题,对我来说,我未能在上课之前加入该类型。 那是我必须改变的:

class Core
{
private:

    py::object cls;
    py::object obj;
    py::object startFunc;
    py::object startFuncAsync;
    py::object stopFunc;
...
public:
...
};

#ifndef CORE_H
#define CORE_H
/* If we are we on Windows, we want a single define for it.*/
#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__))
#define _WIN32
#endif /* _WIN32 */

#if defined(_WIN32) && defined(_CORE_BUILD_DLL)
/* We are building FV as a Win32 DLL */
#define CORE_API __declspec(dllexport)
#elif defined(_WIN32) && defined(CORE_DLL)
/* We are calling FV as a Win32 DLL */
#define CORE_API __declspec(dllimport)
#elif defined(__GNUC__) && defined(_CORE_BUILD_DLL)
/* We are building FV as a shared / dynamic library */
#define CORE_API __attribute__((visibility("default")))
#else
/* We are building or calling CORE as a static library */
#define CORE_API
#endif
class CORE_API Core
{
private:

    py::object cls;
    py::object obj;
    py::object startFunc;
    py::object startFuncAsync;
    py::object stopFunc;
...
public:
...
};

旁注:

这将允许您将项目构建为dlllib,并且两者都不用(即通过包含它们来使用它们),并且您也可以在Linux下编译此代码,因此没有特定于平台的信息在这里。

如果您在Visual Studio中并想要构建dll,只需转到“属性”> C / C ++>“命令行”并输入:

/D_CORE_BUILD_DLL 

并用您自己的指定名称替换CORE