我正在尝试在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 ++文件中的函数。 请帮我解决这个链接器问题。
由于
戒
答案 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!
}