从C文件调用C++函数会产生"未定义的引用"编译器错误

aka*_*jkn 1 c c++ c++11

我有以下文件 - main.c,RULE_MINE.h和RULE_MINE.cpp

main.c中

#include "RULE_MINE.h"
int main()
{
  checker();
}
Run Code Online (Sandbox Code Playgroud)

RULE_MINE.h

#ifndef HEADER_FILE
#define HEADER_FILE

#ifdef __cplusplus

extern "C"
{

#endif

//declare functions here
  void checker();

#ifdef __cplusplus

}

#endif

#endif
Run Code Online (Sandbox Code Playgroud)

RULE_MINE.cpp

#include <bits/stdc++.h>
#include "RULE_MINE.h"

using namespace std;

void checker()
{
  cout<<"whaaat?"<<endl;
}
Run Code Online (Sandbox Code Playgroud)

我正在编译以下方式

$ g++ RULE_MINE.h
$ g++ -c RULE_MINE.cpp
$ g++ main.c
Run Code Online (Sandbox Code Playgroud)

为此,我收到编译器错误

main.c:(.text+0x1947): undefined reference to 'checker'
collect2: error: ld returned 1 exit
Run Code Online (Sandbox Code Playgroud)

我无法找到错误.但是假设我在main.c文件中包含#include"RULE_MINE.cpp",那么它正在运行并提供输出.你能解释一下我收到这个错误的原因吗?

Moh*_*ain 5

更换void checker()extern "C" void checker在你cpp的文件,以确保正确连接(C或CDECL联动).


您的编译命令不正确,您不编译头文件.使用:

$ g++ RULE_MINE.cpp main.c
Run Code Online (Sandbox Code Playgroud)

也许更多的旗帜(-W -Wall -O2例如)

要么

$ g++ -c RULE_MINE.cpp
$ g++ -c main.c # or gcc -c main.c
$ g++ RULE_MINE.o main.o
Run Code Online (Sandbox Code Playgroud)