我需要构建一个将函数导出到c项目的c ++项目 这是我的c ++类:
** MyCppClass.h **
class MyCppClass
{
public:
static void MyCppMethod()
}
** MyCppClass.cpp **
void MyCppClass::MyCppMethod(){}
*现在我需要为Method MyCppMethod(静态)创建一个接口。
我这样做了: ** MyExport.h **#define Export __declspec(dllexport)
extern "C" void Export MyCppMethodWrapper();
** MtExport.cpp **
#include "MyCppClass.h"
#include "MyExport.h"
void MyCppMethodWrapper() { MyCppClass::MyCppMethod();}
就是这样!
现在是C部分(不同的项目) 我将项目与MyExport.lib链接 ** program.c **
#include "MyExport.h" ->does not compile because of the extern "C"
int main()
{
MyCppMethodWrapper();
}
如果我不在program.c中添加行:#include "MyExport.h"
,程序编译并正常工作但我需要为导出提供一个标题(客户端需要标题),我想制作程序使用那个标题。我怎么解决???
感谢您的回答
答案 0 :(得分:5)
如果你想这样做,你可以很容易地有条件地定义extern:
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif
然后:
EXTERN_C Export MyCppMethodWrapper();
答案 1 :(得分:1)
通常你会这样做,在C ++程序中调用C函数,这是extern "C"
的优点。在这种情况下,它对你没有帮助。
您可以做的就是在dll中找到静态方法的名称,在C代码中编写一些extern ...
语句,然后调用静态方法。
请注意,C ++程序中的名称被破坏,即目标文件/库中的名称包含有关方法所属的类及其参数类型的信息。在Linux世界中有一些工具可以解码名称,但我不知道MS Windows世界中有什么可用的东西,大概是什么。
我的一般建议是,如果你必须这样做的话,再考虑一下。
答案 2 :(得分:1)
简短的回答是:你可以使用C ++中的C语言,但不是相反!
如果你想使用C语言中的C ++,你需要使用pure-C函数创建一个瘦包装器(即只有extern "C" { ... }
使用才能在C ++中编译(如此声明)显然,在C)中没有效用,并且从C函数中使用它们。这应该类似于:
#ifdef __cplusplus // defined at least by G++, I don't know for other compilers
extern "C" {
#endif
// ... function definitions here
#ifdef __cplusplus
}
#endif
答案 3 :(得分:0)
除了brainiac的答案,你需要在program.c中使用dllimport
/* declare function directly */
extern "C" void __declspec(dllimport) MyCppMethodWrapper();
int main()
{
MyCppMethodWrapper();
}
如果您想使用相同的标题,则需要使用brainiac的答案,并为#ifdef
使用额外的__declspec(dllexport)
#ifdef MYDLL
#define Export __declspec(dllexport)
#else
#define Export __declspec(dllimport)
#endif
EXTERN_C void Export MyCppMethodWrapper();
然后将/ D MYDLL添加到dll项目的构建标志中。