我正在处理来自张量流存储库的一个相当大的 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 结尾的文件?Makefiles对我来说是相当新的,并且不想包含所有细节,如果您需要Makefile中的任何更多详细信息来回答这个问题,我很乐意编辑我的帖子。
C 和 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/如何从 C 调用C++函数?从C++代码调用 C 函数