具有协议缓冲区的程序无法链接

时间:2015-06-02 08:38:18

标签: c++ compilation linker activemq protocol-buffers

我有一个cpp文件,我试图使用我使用协议缓冲区创建的消息。但是我继续得到那个着名的"未定义的参考"错误如下:

undefined reference to PointMsg::PointMsg()

undefined reference to PointMsg::~PointMsg()

undefined reference to PointMsg::~PointMsg()

这是我的原型文件, Point.proto

message PointMsg {
   required float x = 1;
   required float y = 2;
   optional float z = 3;
   optional string name = 4 [default=""];

   required string sender = 5;
}

执行proto命令生成包含必要功能的附加文件后,我尝试在我的组件中使用它们,这是另一个文件。我将包含为#include "proto/Point.pb.h",我按如下方式使用:

PointMsg pointmsg;
detectObstacle(&pointmsg);

在功能中会发生什么:

void detectObstacle(PointMsg* pointmsg)
{   
    // initialize random seed
    srand (time(NULL));

    // generate two numbers
    int x = rand() % 800 + 1;
    int y = rand() % 800 + 1;

    // assign the values to fields
    pointmsg->set_x(x);
    pointmsg->set_y(y);

    cout<<pointmsg->x()<<endl;
    cout<<pointmsg->y()<<endl;

    string sender = "obstacle_detection";
    cout<<sender<<endl;

    pointmsg->set_sender(sender);
    cout<<pointmsg->sender()<<endl;

    return;
}

以下是用于构建和链接的命令:

g++ -I $APR_INCLUDE -I $CMS_HOME/src/main -g -o obstacle_detection.o -c obstacle_detection.cpp

g++ -L $CMS_HOME/src/main/.libs/ -g -o obstacle_detection obstacle_detection.o -lactivemq-cpp -lssl -lprotobuf -pthread

我得到了未定义引用的错误。我已经花了很多时间在这上面,无法找到任何解决方案。人们一直说我必须在最后添加图书馆,这对我来说不是解决方案。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您需要运行proto编译器来生成特定于protobuf模式的C ++代码(您似乎已经完成了),然后编译并链接 代码!某处应该有Point.pb.o文件。

没有一个固定的库可以为所有未来的消息类型提供代码。公共库仅包含与类型无关的核心操作的公共代码(例如,字段描述符,序列化,重复字段)。但是为您的消息类型提供实际C ++接口的叶代码将成为您必须自己链接的 代码的一部分。