Those "undefined reference" errors make it sound like your build setup is
not passing to the linker the object file generated from http.pb.cc.
http.pb.cc is where those symbols should be defined, so I would
double-check that it's being passed to the linker.

On Sun, Dec 17, 2017 at 5:01 PM, Matthew Bennett <
[email protected]> wrote:

> Hi,
>
> I'm trying to extend the base method options to include http options like
> so:
>
> // Copyright 2016 Google Inc.
> //
> // Licensed under the Apache License, Version 2.0 (the "License");
> // you may not use this file except in compliance with the License.
> // You may obtain a copy of the License at
> //
> //     http://www.apache.org/licenses/LICENSE-2.0
> //
> // Unless required by applicable law or agreed to in writing, software
> // distributed under the License is distributed on an "AS IS" BASIS,
> // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> // See the License for the specific language governing permissions and
> // limitations under the License.
>
>
> syntax = "proto2";
>
>
> import "google/protobuf/descriptor.proto";
>
>
> message Http {
>   // A list of HTTP configuration rules that apply to individual API
> methods.
>   //
>   // **NOTE:** All service configuration rules follow "last one wins"
> order.
>   repeated HttpRule rules = 1;
> }
>
>
> message HttpRule {
>   // Selects methods to which this rule applies.
>   //
>   // Refer to [selector][google.api.DocumentationRule.selector] for
> syntax details.
>   optional string selector = 1;
>
>
>   // Determines the URL pattern is matched by this rules. This pattern
> can be
>   // used with any of the {get|put|post|delete|patch} methods. A custom
> method
>   // can be defined using the 'custom' field.
>   oneof pattern {
>     // Used for listing and getting information about resources.
>     string get = 2;
>
>
>     // Used for updating a resource.
>     string put = 3;
>
>
>     // Used for creating a resource.
>     string post = 4;
>
>
>     // Used for deleting a resource.
>     string delete = 5;
>
>
>     // Used for updating a resource.
>     string patch = 6;
>
>
>     // Custom pattern is used for defining custom verbs.
>     CustomHttpPattern custom = 8;
>   }
>
>
>   // The name of the request field whose value is mapped to the HTTP
> body, or
>   // `*` for mapping all fields not captured by the path pattern to the
> HTTP
>   // body. NOTE: the referred field must not be a repeated field and must
> be
>   // present at the top-level of response message type.
>   optional string body = 7;
>
>
>   // Additional HTTP bindings for the selector. Nested bindings must
>   // not contain an `additional_bindings` field themselves (that is,
>   // the nesting may only be one level deep).
>   repeated HttpRule additional_bindings = 11;
> }
>
>
> // A custom pattern is used for defining custom HTTP verb.
> message CustomHttpPattern {
>   // The name of this custom HTTP verb.
>   optional string kind = 1;
>
>
>   // The path matched by this custom verb.
>   optional string path = 2;
> }
>
>
> extend google.protobuf.MethodOptions {
>   // See `HttpRule`.
>   optional HttpRule http = 72295728;
> }
>
>
> I then run protoc over http.proto and update src/Makefile.am 
> libprotobuf_la_SOURCES
> to include http.pb.cc.
>
> I have another application that uses this extension to auto-generate new
> code like the following:
>
> #include <google/protobuf/descriptor.h>
> #include <google/protobuf/http.pb.h>
>
> void AtlCodeGenerator::GenerateHttpProxyArrayEntry(const HttpRule &
> http_rule, io::Printer* printer)
> {
>     printer->Indent();
>     printer->Print("{\n");
>
>
>     printer->Indent();
>     printer->Print(vars_, ".service_descriptor =
> &$lcfullname$_descriptor,\n");
>     printer->Print(vars_, ".input_msg_descriptor =
> &$inputname$_descriptor,\n");
>     printer->Print(vars_, ".output_msg_descriptor =
> &$outputname$_descriptor,\n");
>     printer->Print(vars_, ".api_ptr = &$lcfullname$_api_$method$,\n");
>
>
>     vars_["body"] = http_rule.body();
>
>
>     if (http_rule.has_get())
>     {
>         vars_["url"] = http_rule.get();
>         printer->Print(vars_, ".url_string = \"$url$\",\n");
>         printer->Print(".http_verb = CMSG_HTTP_GET,\n");
>         printer->Print(vars_, ".body_string = \"$body$\",\n");
>     }
>     else if (http_rule.has_put())
>     {
>         vars_["url"] = http_rule.put();
>         printer->Print(vars_, ".url_string = \"$url$\",\n");
>         printer->Print(".http_verb = CMSG_HTTP_PUT,\n");
>         printer->Print(vars_, ".body_string = \"$body$\",\n");
>     }
>     else if (http_rule.has_post ())
>     {
>         vars_["url"] = http_rule.post();
>         printer->Print(vars_, ".url_string = \"$url$\",\n");
>         printer->Print(".http_verb = CMSG_HTTP_POST,\n");
>         printer->Print(vars_, ".body_string = \"$body$\",\n");
>     }
>     else if (http_rule.has_delete_())
>     {
>         vars_["url"] = http_rule.delete_();
>         printer->Print(vars_, ".url_string = \"$url$\",\n");
>         printer->Print(".http_verb = CMSG_HTTP_DELETE,\n");
>         printer->Print(vars_, ".body_string = \"$body$\",\n");
>     }
>     else if (http_rule.has_patch())
>     {
>         vars_["url"] = http_rule.patch();
>         printer->Print(vars_, ".url_string = \"$url$\",\n");
>         printer->Print(".http_verb = CMSG_HTTP_PATCH,\n");
>         printer->Print(vars_, ".body_string = \"$body$\",\n");
>     }
>     else
>     {
>         assert (false && "Error: a valid HTTP verb must be specified");
>     }
>
>
>     printer->Outdent();
>     printer->Print("},\n");
>     printer->Outdent();
> }
>
>
> void AtlCodeGenerator::GenerateHttpProxyArrayEntriesPerMethod(const
> MethodDescriptor &method,
>                                                               io::Printer*
> printer)
> {
>     string lcname = CamelToLower(method.name());
>     vars_["method"] = lcname;
>     vars_["inputname"] = FullNameToLower(method.input_type()->full_name
> ());
>     vars_["outputname"] = FullNameToLower(method.output_type()->full_name
> ());
>
>
>     if (method.options().HasExtension(http))
>     {
>         HttpRule http_rule = method.options().GetExtension(http);
>         GenerateHttpProxyArrayEntry(http_rule, printer);
>
>
>         // Generate an entry for each additional binding
>         for (int i = 0; i < http_rule.additional_bindings_size(); i++)
>         {
>             GenerateHttpProxyArrayEntry(http_rule.additional_bindings(i),
> printer);
>         }
>     }
> }
>
> This code compiles fine, however when it comes to link the application I
> get the linker errors:
>
> host,cmsg: protoc_cmsg-c_atl_generator.o: In function
> `google::protobuf::compiler::c::AtlCodeGenerator::
> GenerateHttpProxyArrayEntriesPerMethod(google::protobuf::MethodDescriptor
> const&, google::protobuf::io::Printer*)':
> host,cmsg: c_atl_generator.cc:(.text+0x1385): undefined reference to `http
> '
> host,cmsg: c_atl_generator.cc:(.text+0x13a9): undefined reference to
> `http'
> host,cmsg: c_atl_generator.cc:(.text+0x13c6): undefined reference to 
> `HttpRule::HttpRule(HttpRule
> const&)'
> host,cmsg: c_atl_generator.cc:(.text+0x144b): undefined reference to `
> HttpRule::~HttpRule()'
> host,cmsg: c_atl_generator.cc:(.text+0x14ec): undefined reference to
> `HttpRule::~HttpRule()'
> host,cmsg: collect2: error: ld returned 1 exit status
> host,cmsg: Makefile:459: recipe for target 'protoc-cmsg' failed
>
> I can clearly see the following in http.pb.h so am unsure what my problem
> is:
>
> class HttpRule : public ::google::protobuf::Message /*
> @@protoc_insertion_point(class_definition:HttpRule) */ {
>  public:
>   HttpRule();
>   virtual ~HttpRule();
>
>
>   HttpRule(const HttpRule& from);
>
> Any help would be greatly appreciated.
>
> --
> You received this message because you are subscribed to the Google Groups
> "Protocol Buffers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/protobuf.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to