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