提问人:JuanRoa 提问时间:8/20/2019 最后编辑:einpoklumJuanRoa 更新时间:8/20/2019 访问量:403
在标头和 .cc 文件之间建立关系
establish relationship between header and .cc file
问:
几周前,我开始学习 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
答:
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 端口
评论