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

时间:2015-04-27 13:29:58

标签: c++ c c++11

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

的main.c

#include "RULE_MINE.h"
int main()
{
  checker();
}

RULE_MINE.h

#ifndef HEADER_FILE
#define HEADER_FILE

#ifdef __cplusplus

extern "C"
{

#endif

//declare functions here
  void checker();

#ifdef __cplusplus

}

#endif

#endif

RULE_MINE.cpp

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

using namespace std;

void checker()
{
  cout<<"whaaat?"<<endl;
}

我正在编写以下方式

$ g++ RULE_MINE.h
$ g++ -c RULE_MINE.cpp
$ g++ main.c

为此,我收到编译错误

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

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

2 个答案:

答案 0 :(得分:5)

void checker()替换为extern "C" void checker文件中的cpp,以确保正确的链接(C或cdecl链接)。

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

$ g++ RULE_MINE.cpp main.c

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

$ g++ -c RULE_MINE.cpp
$ g++ -c main.c # or gcc -c main.c
$ g++ RULE_MINE.o main.o

答案 1 :(得分:4)

您的实施也需要extern

extern "C" void checker()
{
  cout<<"whaaat?"<<endl;
}