C++ 错误C2375:重新定义;不同连接
api中的错误位置: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);
#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
vsstatic
)extern“C”
vsextern“C++”
)\uu declspec(dllimport)
vs
\u declspec(dllexport)
)//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)
)