从C调用C ++成员函数

时间:2019-01-15 13:30:39

标签: c++ c

以下是我的C ++代码:

#include<iostream>
#include<string.h>
extern "C" void wrapper(struct NB*, int );

struct AssetDbFilter {
    std::string attribute;
    std::string value;
  };

class NB {

public:
    void myTest(int a);
};

以下是C ++代码:

#include<iostream>
#include<string.h>
 #include "test.h"
using namespace std;

void NB :: myTest (int a) {

cout << a;
}
void wrapper(NB* nb, int a) {
nb->myTest(a);
}

以下是我的c代码:

#include<stdio.h>
#include "test.h"
void wrapper(struct NB* ,int );
int main()
{
    AssetDbFilter* assetdb;
    struct NB* nb;
    wrapper(nb, 5);
}

我无法执行此代码。 我正在从C代码调用C ++成员函数。当我以g++ test.c的身份执行此C文件时,出现以下错误:

/tmp/ccr1IaLa.o: In function `main':
test1.c:(.text+0x15): undefined reference to `wrapper'
collect2: error: ld returned 1 exit status

有人可以告诉我如何解决吗?

1 个答案:

答案 0 :(得分:4)

您建立了test.c,太好了!现在,您还需要构建C ++文件,以便显示定义。

当前,您的工具链认为您想将并链接 test.c到应用程序中,但是test.c并不是您的全部源代码。

您无需链接即可编译test.c

gcc test.c -c

然后对您的C ++文件执行相同的操作:

g++ whatever.cpp -c

然后将它们链接在一起以获得可执行文件:

g++ test.o whatever.o -o myProgram

不幸的是,由于您正在调用悬空/未初始化的指针上的成员函数,因此程序仍然无法运行。由于您无法从C代码中实例化NB,因此这种方法行不通。

我建议NB仅包含C兼容成员。然后,您可以将其定义放入共享的头文件中,并随时随地实例化。