C 文件中的 C++ 文件中的链接器错误调用函数
Posted
技术标签:
【中文标题】C 文件中的 C++ 文件中的链接器错误调用函数【英文标题】:Linker error-Calling function in C++ file from C file 【发布时间】:2013-07-12 17:01:34 【问题描述】:我正在尝试在 Linux 环境中执行 C 和 C++ 中的基本代码。 我正在使用eclipse来运行它。当前项目创建为 C 项目。
我要做的就是从同一文件夹中的不同文件调用一个函数。
我有我的主要在sample.c
,在主要我想在A.c
中调用函数sum(int a, int b)
。我能够运行它。但是,当我在 A.cpp
(a C++ 模板文件) 中重写相同的函数 sum 时,它会引发链接器错误。
gcc -o "Test" ./sample.o
./sample.o: 在函数中 主':/home/idtech/workspace/Test/Debug/../sample.c:19:未定义 引用 sum'collect2: ld 返回 1 退出状态 make: * [Test] 错误 1
我在从同一文件夹中的 C 文件调用 C++ 文件中的函数时需要帮助。 请帮我解决这个链接器问题。
谢谢
哈沙
【问题讨论】:
一般来说最好贴出代码 sn-ps 来帮助别人诊断你的问题。不过我猜你需要使用extern "C"
。在这里试试:***.com/questions/1041866/…
【参考方案1】:
C++ 编译器mangles 符号名称用于编码类型信息。通常,在编写应该暴露给 C 代码的 C++ 函数时,您需要将函数包装在 extern "C" ...
块中,就像这样(或者就像 @DaoWen 指出的那样,在它前面加上 extern "C"
前缀):
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!
【讨论】:
如果您只有一个这样的函数,您可以将extern "C"
与函数签名内联,而不是引入新块:extern "C" int sum(int a, int b)
赞成不仅解释了它为什么不起作用(重整),而且还解释了解决方案的缺点(没有重载)。以上是关于C 文件中的 C++ 文件中的链接器错误调用函数的主要内容,如果未能解决你的问题,请参考以下文章