以下是我的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
有人可以告诉我如何解决吗?
答案 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兼容成员。然后,您可以将其定义放入共享的头文件中,并随时随地实例化。