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++ 文件中的链接器错误调用函数的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 调用 dll 函数

Visual Studio 2010 C++:如何判断链接器实际尝试链接的 LIB 文件?

静态方法的 Xcode 中的 C++ 链接器错误

为啥链接器链接了错误的函数?

链接器可以内联函数吗?

C++学习——在C文件中调用C++文件中的函数