链接器错误 - 从C文件中调用C ++文件中的函数

时间:2013-07-12 17:01:34

标签: c++ c linux gcc linker

我正在尝试在Linux环境中执行C和C ++中的基本代码。 我正在使用eclipse来运行它。当前项目创建为C项目。

我要做的就是从同一个文件夹中的不同文件中调用一个函数。 我的主要内容是sample.c,主要是我想在sum(int a, int b)中调用函数A.c。我能够运行它。但是当我在A.cpp一个C ++模板文件)中重写相同的函数sum时,它会抛出链接器错误。

gcc  -o "Test"  ./sample.o 
  

./ sample.o:在功能上   main':/ home / idtech / workspace / Test / Debug /../ sample.c:19:undefined   引用sum'cols2:ld返回1退出状态make: * [Test]   错误1

我需要帮助从同一文件夹中的C文件调用C ++文件中的函数。 请帮我解决这个链接器问题。

由于

1 个答案:

答案 0 :(得分:2)

C ++编译器mangles符号名称,用于编码类型信息。通常,在编写应该暴露给C代码的C ++函数时,您需要将函数包装在extern "C" { ... }块中,就像这样(或者只用extern "C"作为@DaoWen指出的前缀) :

A.cpp:

extern "C" {
    int sum(int a, int b)
    {
        return a+b;
    }
}

caller.c:

extern int sum(int a, int b);
...
int main() { sum(42, 4711); }

通过将函数标记为extern "C",您牺牲了重载它的能力,因为不同的重载只能通过它们的错位符号来区分 ,并且您只需要将其重写为关掉!这意味着你不能这样做:

extern "C" {
    int sum(int a, int b) { return a+b; }
    float sum(float a, float b) { return a+b; } // conflict!
}