在标头和 .cc 文件之间建立关系

establish relationship between header and .cc file

提问人:JuanRoa 提问时间:8/20/2019 最后编辑:einpoklumJuanRoa 更新时间:8/20/2019 访问量:403

问:

几周前,我开始学习 c++。此时,我必须使用在 header 和 .cc 文件中声明和定义的函数。问题是,当我在代码中包含头文件时,我收到一条消息,指出存在未定义的函数。如何在文件 h 和 .cc 之间建立链接?

在我的代码中,我有


#include "CommSerialLinux.h"

.h 文件包含以下内容(出于显而易见的原因,它只是一个摘录)


typedef void (*CallBackFuncPtr)(CCommPacket *, PacketType);

class DYNAMIC_LINK CCommSerialLinux

{
public:

    CCommSerialLinux();
    virtual ~CCommSerialLinux();
    BOOL Open(const char *port);
    BOOL Close();
    BOOL IsOpen(){ return m_IsSerialPortOpened; }
    BOOL Receive();
    BOOL SendRaw(CWriteRawPacket *SendPacket);

    __u32 EncodePkt(CWriteRawPacket *SendPacket, __u8 *Data, int MaxSize);


    void RegisterCallBack(CallBackFuncPtr NewFuncPtr, PacketType RegisterType);


private://unimportant content

};
#endif

另一方面,有一个名为 CommSerialLinux.cc 的文件,其中包含以下内容(摘录)


void CCommSerialLinux::RegisterCallBack(CallBackFuncPtr NewFuncPtr, PacketType RegisterType)

{
    if(RegisterType < 0 || RegisterType > 255) return;
    m_CallBackFuncPtr[RegisterType] = NewFuncPtr;
    m_CallBackFuncReg[RegisterType] = TRUE;
}

编译时,我收到以下错误:

引用 'CCommSerialLinux::RegisterCallBack(void ()(CCommPacket, PacketType), PacketType)' sin definir

C++ Raspberry-Pi 头文件 未定义引用

评论

2赞 melpomene 8/20/2019
你是如何编译你的代码的?

答:

0赞 einpoklum 8/20/2019 #1

您需要将每个文件(包括一些头文件 - 包括从其他地方包含的头文件的重复包含)编译为目标代码。这可以通过单个编译命令来完成,该命令还将对象链接到可执行文件中;或者,您可以单独编译每个文件,然后将它们链接在一起。.cc.cc

在编译时,某些函数未定义不是问题 - 它们应该源自其他已编译的对象,并在链接期间被发现。

(由于您没有确切说明如何尝试构建可执行文件,因此我不能更具体。

评论

0赞 JuanRoa 8/20/2019
到目前为止,我只处理了一个文件,所以我编译了:sudo g ++ main2.cpp -larmadillo(我正在使用犰狳库)。现在,请注意,我应该使用的“库”附带一个包含以下内容的 make 文件: ####### Files OBJECTS = obj / AckPacket.o obj / CommPacket.o obj / CommSerialLinux.o obj / GPSTelemPacket.o obj / StdTelemPacket.o obj / TranslatePacket.o obj / WriteRawPacket.o obj / Demo1.o TARGET = Demo1 ####### 构建规则###
0赞 JuanRoa 8/20/2019
据我了解,名为“demo”的文件应该是我的代码,对象在哪里,将链接到我的代码的所有其他文件的编译在哪里?
0赞 melpomene 8/20/2019
@JuanRoa 你为什么要以 root 身份编译?!
0赞 JuanRoa 8/20/2019
@melpomene虽然它与问题无关,但复制和粘贴错误,因为我以 root 身份运行,因为我使用的是树莓派的 ttyS0 端口