C++ 我试着打电话给c++;要从C文件运行到我的cpp文件,但出现一些错误:
我有一个C++ 我试着打电话给c++;要从C文件运行到我的cpp文件,但出现一些错误:,c++,c,C++,C,我有一个 c++ project dll type . 我在这个项目中添加/创建了一个名为it ENCODER.c的新项目/文件 在ENCODER.c中,我有一些功能,如: void init() { } void start() { } 现在我添加/创建了一个名为:ENCODER.h的新头文件 在这一次中,我做到了: namespace Encode { class Encode { public: static __declspec(dllexport)
c++ project dll type .
我在这个项目中添加/创建了一个名为it ENCODER.c的新项目/文件
在ENCODER.c中,我有一些功能,如:
void init()
{
}
void start()
{
}
现在我添加/创建了一个名为:ENCODER.h的新头文件
在这一次中,我做到了:
namespace Encode
{
class Encode
{
public:
static __declspec(dllexport) void init();
};
}
然后在cpp文件中,我做了:
#include <stdexcept>
using namespace std;
#include "stdafx.h"
#include "targetver.h"
#include "ENCODER.h"
extern "C" {
void myinit()
{
Encode::Encode::init();
}
}
将执行/激活C文件中的init()函数
现在在做了所有这些之后,我得到了两个错误:
首先,您需要
declspec(export)
整个类,但这比使用类时需要declspec(import)
更复杂。在构建库时使用以下宏并定义构建\u MYLIBRARY
(并确保在使用库时未定义)
然后像这样使用它:
class MYLIBRARY_EXPORT Encode
{
...
};
接下来确保C++所能看到的任何C函数都被声明为代码>外部“C”<代码>,以关闭名称的限制(技术C++用于允许函数重载)。因此,为C函数创建一个头(<代码>编码器.h代码)>文件,并在任何C++实现文件中包含头文件,希望使用这些函数:
#pragma once
#ifdef __cplusplus
extern "C"
{
#endif
void MYLIBRARY_EXPORT init();
void MYLIBRARY_EXPORT start();
#ifdef __cplusplus
} // extern "C"
#endif
然后在一个单独的实现(ENCODER.c
)文件中实现这些函数(使用MYLIBRARY\u EXPORT
是可选的;这取决于是否要从.dll
公开它们)。在实现它们时,只要编译器已经看到头文件,就不需要外部“C”
或MYLIBRARY\u EXPORT
,所以要包括它:
#include "ENCODER.h"
void init()
{
...
}
void start()
{
...
}
建议:选择更好的名字!
start()
函数已经存在于C运行时库中,那么initEncoder()
和startEncoder()
如何?我现在尝试将H头文件代码更改为:namespace Encode{extern“C”{class Encode{public:static u declspec(dllexport)void init();}},但错误相同。可能问题是在头文件中我没有使用void init()?我需要澄清一些事情。#ifdef BUILDING#u MYLIBRARY所有这部分我都放在c文件中头文件还是cpp文件?第二个类MYLIBRARY\u导出编码我在cpp文件中使用它?我试图使用它,但在我使用的任何地方,我在MYLIBRARY_导出时都遇到一个错误,错误是:未知属性“import”那么,编码器.c文件到底是什么?你是说要创建一个新的c文件还是我现在已经拥有的一个带有函数的c文件?是的,构建我的库
宏定义应该包含在一个头文件中,并且包含从.dll
导出的符号。如果需要是类和函数声明的一部分(即在头文件中),则不是定义或实现文件。
#pragma once
#ifdef __cplusplus
extern "C"
{
#endif
void MYLIBRARY_EXPORT init();
void MYLIBRARY_EXPORT start();
#ifdef __cplusplus
} // extern "C"
#endif
#include "ENCODER.h"
void init()
{
...
}
void start()
{
...
}