C++ 错误C2375:重新定义;不同连接

C++ 错误C2375:重新定义;不同连接,c++,redefinition,C++,Redefinition,api中的错误位置: #define DLLEXPORT extern "C" __declspec(dllexport) DLLEXPORT int CAnyseeUSBTVControllerDlg::InitCaptureDevice() { 在my.h库类和函数定义中: class CAnyseeUSBTVControllerDlg : public CDialog { // Construction public: int InitCaptureDevice(void);

api中的错误位置:

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int CAnyseeUSBTVControllerDlg::InitCaptureDevice()
{
在my.h库类和函数定义中:

class CAnyseeUSBTVControllerDlg : public CDialog
{
// Construction
public:
    int InitCaptureDevice(void);
//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);
     }
}
你知道怎么解决吗

“错误1错误C2375: 'CanyseeutvControllerDLG::InitCaptureDevice' :重新定义;不同 链接c:\程序 文件\toATS\u DVS\anysee\anyseee30\anyseee30\anyseeeusbtvcontrollerdlg.cpp 122 anyseee30“


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

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

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

也要从中定义

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


我相信静态成员也可以
extern“C”
,但是你不能直接做你想做的事情。您将需要创建一个只使用C语言的包装器接口来调用类成员函数。然后,您可以
extern“C”
包装并将其暴露在DLL之外。

这可能是因为

  • 您使用在不同位置定义了函数的原型 不同的可见性(
    extern
    vs
    static
  • 同上,但 不同的名称混乱(
    extern“C”
    vs
    extern“C++”
  • 与上面相同,但不同的dll导出(
    \uu declspec(dllimport)
    vs
    \u declspec(dllexport)
  • 若要解决此问题,请为文件启用/p以查看它们是如何预处理的(这必须是逐个文件的,并且将停止为该文件生成.obj),查找带有结果的.i文件

    或者使用/displayincludes,或者简单地对代码进行灰显

    //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 uu declspec的名称放在要导出的函数前面,就像导出类型一样

    您也可以在函数定义中执行相同的操作:

    class CAnyseeUSBTVControllerDlg : public CDialog
    {
    // Construction
    public:
        int InitCaptureDevice(void);
    
    //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放在前面即可。

    今天我遇到了同样的问题,对我来说,我没有在我的类之前包含类型。 那就是我必须改变:

    类核心
    {
    私人:
    py::对象cls;
    py::objectobj;
    py::objectstartfunc;
    py::objectstartfuncsync;
    py::对象stopFunc;
    ...
    公众:
    ...
    };
    

    \ifndef CORE\u H
    #定义核心
    /*如果我们在Windows上,我们需要一个单一的定义*/
    #如果!已定义(WIN32)和&(已定义(uWin32)| |已定义(WIN32)| | |已定义(uu MINGW32 124;))
    #定义WIN32
    #endif/*\u WIN32*/
    #如果已定义(_WIN32)和已定义(_CORE_BUILD_DLL)
    /*我们正在将FV构建为Win32 DLL*/
    #定义核心API declspec(dllexport)
    #elif已定义(_WIN32)和已定义(核心DLL)
    /*我们将FV称为Win32 DLL*/
    #定义核心API declspec(dllimport)
    #elif已定义(uuu GNUC_uuuuuu)和已定义(_CORE_BUILD_DLL)
    /*我们正在将FV构建为一个共享/动态库*/
    #定义核心API属性(可见性(“默认”))
    #否则
    /*我们正在构建或调用CORE作为静态库*/
    #定义核心API
    #恩迪夫
    类核心(API核心)
    {
    私人:
    py::对象cls;
    py::objectobj;
    py::objectstartfunc;
    py::objectstartfuncsync;
    py::对象stopFunc;
    ...
    公众:
    ...
    };
    
    旁注:

    这将允许将您的项目构建为
    dll
    lib
    ,两者都不是(即通过包含它们来使用它们),您也可以在linux下编译此代码,因此此处没有特定于平台的内容

    如果您在visual studio中并希望构建dll,只需转到属性>C/C++>命令行并输入:

    /D_CORE_BUILD_DLL 
    

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

    您确定需要创建非静态成员函数
    extern“C”
    ?是的,我需要为我的Python应用程序创建.dll。也许您应该使用静态方法?否则,您需要处理一个隐式this指针。由于您不导出整个类,所以我不确定它是否能工作。您将不得不考虑一开始该类的实例是如何创建的。不导出构造函数是一个问题。并不是说外部代码会知道如何使用它。您需要导出一个工厂函数。现在我遇到了致命错误LNK1104:无法打开文件'LIBC.lib'-damn/在这种情况下,有人能纠正宏吗?我想我的意图是正确的。可能不能在成员方法上使用外部“C”?如果任何声明说明符在声明之前,它也必须在.h文件中的定义之前(例如
    \u declspec(dllexport)