解决 c++ 调用 c 函数报错: undefined reference to ‘xxx‘ 的问题

 更新时间:2026年05月19日 09:55:43   作者:java叶新东  
本文主要讨论了C++与C混合编程时遇到的问题及解决方案,由于默认编规则不同,.cpp文件调用.c文件函数时会出现错误,下面就来详细的介绍一下解决方法,感兴趣的可以了解一下

先上代码

main.cpp

#include "func.h"
int main() {
    return add(1,4);
}

func.h

#ifndef UNTITLED_FUNC_H
#define UNTITLED_FUNC_H
int add(int a,int b);
#endif //UNTITLED_FUNC_H

func.c

#include "func.h"

int add(int a,int b){
    return a+ b;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
project(untitled)

set(CMAKE_CXX_STANDARD 11)

include_directories(./include)

add_executable(untitled main.cpp src/func.c include/func.h)

代码结构如下图

编译

以上代码中只有main.cpp 是c++文件,其他文件都是c语言的;当进行编译后会提示以下错误:

====================[ Build | untitled | Debug ]================================
/usr/local/cmake_3.23.0/cmake-3.23.0/bin/cmake --build /tmp/tmp.HB9zcw9fre/cmake-build-debug --target untitled -- -j 22
Consolidate compiler generated dependencies of target untitled
[ 33%] Building CXX object CMakeFiles/untitled.dir/main.cpp.o
[ 66%] Building C object CMakeFiles/untitled.dir/src/func.c.o
[100%] Linking CXX executable untitled
/usr/bin/ld: CMakeFiles/untitled.dir/main.cpp.o: in function `main':
/tmp/tmp.HB9zcw9fre/main.cpp:3: undefined reference to `add(int, int)'
collect2: error: ld returned 1 exit status
gmake[3]: *** [CMakeFiles/untitled.dir/build.make:113: untitled] Error 1
gmake[2]: *** [CMakeFiles/Makefile2:83: CMakeFiles/untitled.dir/all] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:90: CMakeFiles/untitled.dir/rule] Error 2
gmake: *** [Makefile:124: untitled] Error 2

东西太多,我们只需要关注这一行,意思是找不到 add(int, int) 函数

/tmp/tmp.HB9zcw9fre/main.cpp:3: undefined reference to `add(int, int)'

这是因为.cpp 文件默认使用的是 c++编译器, 而 .c 文件默认使用的是 c 编译器,实际在编译的过程中,.cpp 文件调用 .c 文件中的函数就会出错.

至于为什么不能这么干,这篇文章说的很清楚, 有兴趣的请戳: https://blog.csdn.net/challenglistic/article/details/130223118

解决方案一

  • 将所有的 .c 文件后缀改为 .cpp;所有的 .h 改为 .hpp
  • 或者将所有的 .cpp 文件后缀改为 .c,所有的 .hpp 改为 .h(注意:代码中未用到 c++ 特性才能这么干)

解决方案二

在所有的.h文件头尾加上以下代码即可, 注意,只加头文件即可

#ifdef __cplusplus
extern "C" {
#endif

  // 函数声明

#ifdef __cplusplus
}
#endif

加完后运行如下图,可以正常运行了

到此这篇关于解决 c++ 调用 c 函数报错: undefined reference to ‘xxx‘ 的问题的文章就介绍到这了,更多相关c++ 调用 c 函数报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c语言中static和extern的用法详细解析

    c语言中static和extern的用法详细解析

    以下是对c语言中static和extern的用法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-09-09
  • C++实现通讯录管理系统设计

    C++实现通讯录管理系统设计

    这篇文章主要为大家详细介绍了C++实现通讯录管理系统设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • OpenCV获取视频的每一帧并保存为.jpg图片

    OpenCV获取视频的每一帧并保存为.jpg图片

    这篇文章主要为大家详细介绍了OpenCV获取视频的每一帧,并保存为.jpg图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • VC WinExec打开指定程序或者文件的方法

    VC WinExec打开指定程序或者文件的方法

    使用WinExec命令打开指定程序或者文件的参数说明
    2008-11-11
  • C++中引用和const关键字介绍

    C++中引用和const关键字介绍

    大家好,本篇文章主要讲的是C++中引用和const关键字介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • QT实现简单TCP通信

    QT实现简单TCP通信

    这篇文章主要为大家详细介绍了QT实现简单的TCP通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 编译错误error: stray ‘\343’in program的解决方法

    编译错误error: stray ‘\343’in program的解决方法

    以下是对编译错误error: stray ‘\343’in program的解决方法进行了详细的分析介绍,如遇此问题的朋友们可以过来参考下
    2013-07-07
  • C++的std::transform()的实现

    C++的std::transform()的实现

    在 C++ 标准库中,std::transform() 是一个非常有用的算法函数,它能够将给定范围中的每个元素进行变换,并将变换后的结果存储到另一个范围中,本文就详细的介绍一下具体用法,感兴趣的可以了解一下
    2023-08-08
  • 详解安卓系统中的Android.mk文件

    详解安卓系统中的Android.mk文件

    这篇文章主要介绍了详解安卓系统中的Android.mk文件,该文件用来告诉系统关于源代码的编译,需要的朋友可以参考下
    2015-07-07
  • 解决Devc++运行窗口中文乱码的实现步骤

    解决Devc++运行窗口中文乱码的实现步骤

    本文主要介绍了如何解决Devc++运行窗口中文乱码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论