我正在处理来自tensorflow存储库的一个相当大的Makefile,我需要添加一个文件链接。
在对链接错误进行了相当多的调试之后,我发现如果我的文件以.cc结尾,那么链接错误就会消失,而当链接.c文件时,错误就会出现(文件内容保持不变)。
我将文件链接到一个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中的任何进一步的细节来回答这个问题,我很乐意编辑我的帖子。
发布于 2019-12-10 14:13:12
C和C++函数的名称解析是不同的。这有时会给也是有效的"C++“的"C”代码带来问题。例如:
int foo(int x) { return x+1 } ;代码将在编译为"C“时创建名为”foo“的函数,并在编译为C++时创建名为”_Z3fooi“的函数。(使用c++filt)解码C++名称将显示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
https://stackoverflow.com/questions/59257311
复制相似问题