在projectA.vcproj
中#ifdef __cplusplus
extern "C" {
#endif
void functionA();
#ifdef __cplusplus
}
#endif
void functionA()
{
//function defined
}
在projectB.vcproj中:
void functionB() ;
#include "fileA.h"
#include "fileB.h"
void functionB() {
functionA(); // error: undefined reference to 'functionA'
}
我在Linux上编译代码时遇到错误,请帮我解决这个问题。
答案 0 :(得分:4)
您必须将文件链接在一起。
Source code ---compile--> Object files ---link--> Application fileA.c ------------+ |---> fileA.o ---------+ +---+ | | | fileA.h --------+ +--> a.out | | +---+ | |---> fileB.o ---------+ fileB.cpp ----------+
编译成功后,链接器会给出“未定义的XXX引用”错误消息。
您需要确保所有文件都链接在一起。
$ ls fileA.c fileA.h fileB.cpp fileB.h $ gcc -c fileA.c $ g++ -c fileB.cpp fileA.c fileA.h fileA.o fileB.cpp fileB.h fileB.o $ g++ fileA.o fileB.o $ ls a.out fileA.c fileA.h fileA.o fileB.cpp fileB.h fileB.o
答案 1 :(得分:1)
错误消息可能来自链接器,因此您需要确保编译两个源文件并正确链接它们:
gcc -c fileA.c
g++ -c fileB.cpp
g++ -o program fileB.o fileA.o
当然,您应该确保fileA.c
包含fileA.h
。如果省略fileA.c
的标题,并且使用以下代码编译代码:
g++ -c fileA.c # g++ instead of gcc
g++ -c fileB.cpp
g++ -o program fileB.o fileA.o
然后您将获得缺少的引用,因为g++
将创建一个C ++链接functionA()
,但期望调用C链接functionA()
。
但是,您不应该使用g++
编译C代码;那是在惹麻烦。
最初询问时,fileB.cpp
未包含任何标题。
#include "fileB.h"
#include "fileA.h" // Provide extern "C" declaration of functionA()
void functionB() {
functionA();
}
答案 2 :(得分:1)
您需要在函数头文件中包含函数的头文件。所以在fileB.h中添加#include“fileA.h”行
答案 3 :(得分:0)
你如何编译?
gcc filea.c fileb.cpp
应该做伎俩。