从.cpp文件中调用的.cpp文件调用的函数

时间:2012-07-13 17:12:43

标签: c++ c linux

在projectA.vcproj

fileA.h

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

fileA.c

void functionA()
{
//function defined
}

在projectB.vcproj中:

fileB.h

void functionB() ;

fileB.cpp

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

我在Linux上编译代码时遇到错误,请帮我解决这个问题。

4 个答案:

答案 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未包含任何标题。

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

应该做伎俩。