2

In projectA.vcproj

fileA.h

#ifdef __cplusplus
extern "C" {
#endif
void functionA();
#ifdef __cplusplus
}
#endif

fileA.c

void functionA()
{
//function defined
}

In projectB.vcproj:

fileB.h

void functionB() ;

fileB.cpp

#include "fileA.h"
#include "fileB.h"
void functionB() {
    functionA(); // error: undefined reference to 'functionA'
}

I am getting the error when I compile my code on Linux, please help me fix this.

4

4 回答 4

4

您必须将文件链接在一起。

源代码---编译--->目标文件---链接--->应用

文件A.c ------------+
                    |---> 文件A.o ---------+
                +---+ |
                | |
fileA.h --------+ +--> a.out
                | |
                +---+ |
                    |---> 文件B.o ---------+
文件B.cpp ----------+

成功编译后,链接器会给出“未定义对 XXX 的引用”错误消息。

您需要确保所有文件都链接在一起。

$ ls
文件A.c 文件A.h 文件B.cpp 文件B.h
$ gcc -c fileA.c 
$ g++ -c fileB.cpp
文件A.c 文件A.h 文件A.o 文件B.cpp 文件B.h 文件B.o
$ g++ 文件A.o 文件B.o 
$ ls
a.out 文件A.c 文件A.h 文件A.o 文件B.cpp 文件B.h 文件B.o
于 2012-07-13T17:23:30.417 回答
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不包括任何标题。

文件B.cpp

#include "fileB.h"
#include "fileA.h"  // Provide extern "C" declaration of functionA()
void functionB() {
    functionA();
}
于 2012-07-13T17:15:59.330 回答
1

你需要在functionB的头文件中包含functionA的头文件。所以在 fileB.h 添加行 #include "fileA.h"

于 2012-07-13T17:16:29.940 回答
0

你如何编译?

gcc filea.c fileb.cpp

应该做的伎俩。

于 2012-07-13T17:16:59.720 回答