为什么链接.cc文件在make文件中起作用,但是链接.c文件却不起作用?

时间:2019-12-09 22:01:24

标签: c makefile gnu-make tensorflow-lite cc

我正在使用tensorflow存储库处理一个很大的Makefile,我需要添加一个文件链接。

在对链接错误进行了大量调试之后,我发现如果我的文件以.cc结尾,则链接错误消失,而在链接.c文件时,会出现错误(文件内容保持不变)。 / p>

我正在将文件链接到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结尾的链接错误结尾为:

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中的更多详细信息来回答这个问题,我很乐意编辑我的帖子。

1 个答案:

答案 0 :(得分:4)

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