为什么链接 .cc 文件在 make 文件中有效,但链接 .c 文件却不行?

Why linking .cc file works in make file but linking .c file doesn't?

我正在处理来自 tensorflow 存储库的一个相当大的 Makefile,我需要添加一个文件 link。

在对 link 错误进行相当多的调试之后,我发现如果我的文件以 .cc 结尾,那么 link 错误就会消失,而当 linking a . c文件,出现错误(文件内容保持不变)。

我正在 link 中 Makefile.inc 文件中的文件:

.
.
.
FL_SRCS := \
tensorflow/lite/vis_mi/main.cc \
myFunctions.c \ -->>>>IF I CHANGE THE FILENAME TO myFunctions.cc and link to this .cc file here, it works!!
.
.
.
# Builds a standalone binary.
$(eval $(call vis_test,vis_mi,\
$(FL_SRCS),$(FL_HDRS)))

使用.c结尾时出现link错误:

tensorflow/lite/vis_mi/main.o: In function `main':
tensorflow/lite/vis_mi/main.cc:183: undefined reference to `printMsg()'
../downloads/gcc_embedded/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/bin/ld: link errors found, deleting executable `tensorflow/lite/vis_mi'
collect2: error: ld returned 1 exit status
gmake: *** [tensorflow/lite/vis_mi/Makefile.inc:578: tensorflow/lite/vis_mi/bin/micro_speech] Error 1

.c文件代码:

#include <stdio.h>
#include "myFunctions.h"


void printMsg(){
    //do something here
}

和头文件:

#ifndef MYFUNCTIONS_H
#define MYFUNCTIONS_H

void printMsg();
#endif /* MYFUNCTIONS_H */

如何包含以 .c 结尾的文件? Makefile 对我来说相当新,不想包含所有细节,如果您需要 Makefile 的任何进一步细节来回答这个问题,我很乐意编辑我的 post.

C 和 C++ 函数的名称解析不同。这有时会对 "C" 也有效 "C++" 的代码造成问题。例如:

int foo(int x) { return x+1 } ;

代码将在编译为 "C" 时创建一个名为 'foo' 的函数,在编译为 C++ 时将创建一个名为“_Z3fooi”的函数。解码 C++ 名称(使用 c++filt)将显示 foo(int)。不同的原因是 C++ 支持多态函数(和方法),因此函数名也可以识别其参数的类型。

正确的解决方案是决定代码的语言。 C++ 和 C 是不同的语言,虽然可以编写对两者都有效的代码,但这会限制利用每个函数功能的能力。

重要约束:如果项目同时包含 C 和 C++ 代码,请务必记住,只有遵循 "C" 约定的函数才能在两种语言之间调用。这通常使用 extern "C" 指令和 #ifdef __cplusplus:

来实现

查看更多:https://www.thegeekstuff.com/2013/01/mix-c-and-cpp/ How to call C++ function from C? Call a C function from C++ code