在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“
答案 0 :(得分:6)
您必须确保在头文件中使用相同的声明。否则它被视为不同的方法。
class CAnyseeUSBTVControllerDlg : public CDialog
{
// Construction
public:
int InitCaptureDevice(void);
DLLEXPORT int CaptureDevice(void);
答案 1 :(得分:2)
这可能是因为
extern
vs static
)extern "C"
vs extern "C++"
)__declspec(dllimport)
vs
__declspec(dllexport)
)。要解决,启用/ 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:
...
};
旁注:
这将允许您将项目构建为dll
或lib
,并且两者都不用(即通过包含它们来使用它们),并且您也可以在Linux下编译此代码,因此没有特定于平台的信息在这里。
如果您在Visual Studio中并想要构建dll,只需转到“属性”> C / C ++>“命令行”并输入:
/D_CORE_BUILD_DLL
并用您自己的指定名称替换CORE
。