C ++ Protobuf,尝试构建导入另一个文件描述符时出错

C++ Protobuf, error when trying to build a FileDescriptor that imports another one

目前我有以下两个 proto 定义,两个 .proto 文件都在同一个文件夹中:
topmessage.proto:

syntax = "proto3";
message TopMessage {
    // some fields
}

crestmessage.proto:

syntax = "proto3";
import "topmessage.proto";
message CrestMessage {
    // some fields
    TopMessage tm = 4;
}

然后,作为我的 reader.cc 的一部分,我正在尝试为用户传入的 proto 定义构建一个文件描述符。更具体地说,用户将传递 .proto 文件的路径作为一个参数,然后程序将读取文件并从中构建一个文件描述符。下面是这个功能的实现方式,主要是按照Floris的博客https://vdna.be/site/index.php/2016/05/google-protobuf-at-run-time-deserialization-example-in-c/:

DescriptorPool pool;
const FileDescriptor* buildFileDescriptor(string file_path, string file_name) {
    int def_messageFile = open(file_path.c_str(), O_RDONLY);
    FileInputStream file_input(def_messageFile);
    Tokenizer input(&file_input, NULL);
    FileDescriptorProto file_desc_proto;
    Parser parser;
    if (!parser.Parse(&input, &file_desc_proto)) {
        cerr << "Failed to parse .proto definition:" << endl;
        return NULL;
    }

    file_desc_proto.set_name(file_name);
    const FileDescriptor* file_desc = pool.BuildFile(file_desc_proto);

    return file_desc;
}

现在的问题是,当我尝试构建 CrestMessage 时,它​​的原型定义文件也是作为参数传入的文件。为简单起见,我首先通过手动提供其文件地址来构建 TopMessage,因为它是依赖项,并且工作正常,而且我还可以在池中找到 TopMessage,这是全局的。但是,当我尝试构建 CrestMessage 时,它​​给出了错误。

const FileDescriptor* file_desc2 = buildFileDescriptor("topmessage.proto", "TopMessage");
cout << pool.FindFileByName("TopMessage") << endl;
const FileDescriptor* file_desc = buildFileDescriptor(definition_path, "CrestMessage");
cout << file_desc->name() << endl;

enter image description here

我没有在 Google 的 api 描述中找到任何关于如何导入的内容,有人知道应该使用什么吗?

这是一个名称问题,在构建 FileDescriptor 时不要使用消息名称,而是使用 .proto 文件的名称(例如“topmessage.proto”)