建立头文件和 .cc 文件之间的关系
establish relationship between header and .cc file
几周前我开始学习c++。这时我必须使用在头文件和.cc 文件中声明和定义的函数。问题是当我在我的代码中包含头文件时,我收到一条消息说有未定义的函数。如何在文件h和.cc之间建立link?
在我的代码中我有
#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;
}
编译时出现以下错误:
reference to `CCommSerialLinux::RegisterCallBack(void ()(CCommPacket, PacketType), PacketType)' sin definir
您需要将每个 .cc
文件(其中包括一些头文件 - 包括重复包含从其他地方包含的头文件)编译成目标代码。这可以通过单个编译命令完成,该命令还将对象links 转换为可执行文件;或者您可以单独编译每个 .cc
文件,然后 link 它们一起编译。
编译时,某些函数未定义不是问题 - 它们应该源自其他已编译对象,并在 linking 期间被发现。
(因为您没有具体说明您尝试构建可执行文件的方式,所以我不能说得更具体。)
几周前我开始学习c++。这时我必须使用在头文件和.cc 文件中声明和定义的函数。问题是当我在我的代码中包含头文件时,我收到一条消息说有未定义的函数。如何在文件h和.cc之间建立link?
在我的代码中我有
#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;
}
编译时出现以下错误:
reference to `CCommSerialLinux::RegisterCallBack(void ()(CCommPacket, PacketType), PacketType)' sin definir
您需要将每个 .cc
文件(其中包括一些头文件 - 包括重复包含从其他地方包含的头文件)编译成目标代码。这可以通过单个编译命令完成,该命令还将对象links 转换为可执行文件;或者您可以单独编译每个 .cc
文件,然后 link 它们一起编译。
编译时,某些函数未定义不是问题 - 它们应该源自其他已编译对象,并在 linking 期间被发现。
(因为您没有具体说明您尝试构建可执行文件的方式,所以我不能说得更具体。)