链接错误c和c(未定义的引用)
发布时间:2020-12-16 09:50:03 所属栏目:百科 来源:网络整理
导读:abc.c文件 #include "abc.h"int abc(){ return 10;} abc.h文件 int abc(); mymain.cpp文件 #include "abc.h"int main(){ abc(); return 0;} Makefile文件 CC=gcc -O2 CP=g++mymain: mymain.o abc.o $(CP) -o mymain mymain.o abc.omymain.o: mymain.cpp abc.
abc.c文件
#include "abc.h" int abc() { return 10; } abc.h文件 int abc(); mymain.cpp文件 #include "abc.h" int main() { abc(); return 0; } Makefile文件 CC=gcc -O2 CP=g++ mymain: mymain.o abc.o $(CP) -o mymain mymain.o abc.o mymain.o: mymain.cpp abc.h $(CP) -c mymain.cpp abc.h abc.o: abc.c abc.h $(CC) -c abc.c abc.h clean: $(RM) *.o mymain 产量 g++ -c mymain.cpp abc.h gcc -O2 -c abc.c abc.h g++ -o mymain mymain.o abc.o mymain.o: In function `main': mymain.cpp:(.text+0x5): undefined reference to `abc()' collect2: error: ld returned 1 exit status make: *** [mymain] Error 1 为什么abc()是未定义的引用? UPDATE 新的abc.h extern "C" { int abc(); } 错误 g++ -c mymain.cpp abc.h gcc -O2 -c abc.c abc.h In file included from abc.c:1:0: abc.h:1:8: error: expected identifier or ‘(’ before string constant extern "C" { ^ abc.h:1:8: error: expected identifier or ‘(’ before string constant extern "C" { ^ make: *** [abc.o] Error 1 解决方法
问题是你试图将C函数链接到C对象,而不告诉编译器这是你在做什么.
如果您的头文件(abc.h)看起来像这样: extern "C" { int abc(); } 它会工作(当包含在C源中时……但是当包含在C源中时会中断). 您可以将外部“C”{及其尾随}括在宏中,如Combining C++ and C – how does #ifdef __cplusplus work?所示,以便适合C和C包含. 请注意,makefile中的$(CP)-c mymain.cpp abc.h没有意义 – 您不希望在编译器命令行上指定标头.这适用于该模式的两个实例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |