There are a million ways to do things with makefiles... did you try my
suggestion? The example you pasted builds the binary all in one step
(compile and link) and includes the protobuf cflags and ldflags as
arguments to the compiler. So it works. Your makefile does not include
the protobuf cflags when compiling. So it doesn't work. The fact that
yours does it in two stages (compile, then link) vs this example
makefile doing it one stage is basically irrelevant though. It is
usually better to do things in two stages though (unlike this example
makefile) so that you get to reuse existing work better.

  -ilia

On Thu, Feb 28, 2013 at 2:10 PM, Mohammad Husain <farhan1...@hotmail.com> wrote:
> Hi Ilia,
>
> Though I have CFLAGS defined in my makefile I don't think that is being
> used. The Makefile in the example directory (copied below) does not have
> either the %.o:%.cc rule or any CFLAGS or CXXFLAGS but still it can build
> the executable successfully using the default ones.
>
> <ExampleMakefile>
> # See README.txt.
>
> .PHONY: all cpp java python clean
>
> all: cpp java python
>
> cpp:    add_person_cpp    list_people_cpp
> java:   add_person_java   list_people_java
> python: add_person_python list_people_python
>
> clean:
>     rm -f add_person_cpp list_people_cpp add_person_java list_people_java
> add_person_python list_people_python
>     rm -f javac_middleman AddPerson*.class ListPeople*.class
> com/example/tutorial/*.class
>     rm -f protoc_middleman addressbook.pb.cc addressbook.pb.h
> addressbook_pb2.py com/example/tutorial/AddressBookProtos.java
>     rm -f *.pyc
>     rmdir com/example/tutorial 2>/dev/null || true
>     rmdir com/example 2>/dev/null || true
>     rmdir com 2>/dev/null || true
>
> protoc_middleman: addressbook.proto
>     protoc --cpp_out=. --java_out=. --python_out=. addressbook.proto
>     @touch protoc_middleman
>
> add_person_cpp: add_person.cc protoc_middleman
>
>     pkg-config --cflags protobuf  # fails if protobuf is not installed
>     c++ add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config
> --cflags --libs protobuf`
>
> list_people_cpp: list_people.cc protoc_middleman
>
>     pkg-config --cflags protobuf  # fails if protobuf is not installed
>     c++ list_people.cc addressbook.pb.cc -o list_people_cpp `pkg-config
> --cflags --libs protobuf`
>
> javac_middleman: AddPerson.java ListPeople.java protoc_middleman
>     javac AddPerson.java ListPeople.java
> com/example/tutorial/AddressBookProtos.java
>     @touch javac_middleman
>
> add_person_java: javac_middleman
>     @echo "Writing shortcut script add_person_java..."
>     @echo '#! /bin/sh' > add_person_java
>     @echo 'java -classpath .:$$CLASSPATH AddPerson "$$@"' >> add_person_java
>     @chmod +x add_person_java
>
> list_people_java: javac_middleman
>     @echo "Writing shortcut script list_people_java..."
>     @echo '#! /bin/sh' > list_people_java
>     @echo 'java -classpath .:$$CLASSPATH ListPeople "$$@"' >>
> list_people_java
>     @chmod +x list_people_java
>
> add_person_python: add_person.py protoc_middleman
>     @echo "Writing shortcut script add_person_python..."
>     @echo '#! /bin/sh' > add_person_python
>     @echo './add_person.py "$$@"' >> add_person_python
>     @chmod +x add_person_python
>
> list_people_python: list_people.py protoc_middleman
>     @echo "Writing shortcut script list_people_python..."
>     @echo '#! /bin/sh' > list_people_python
>     @echo './list_people.py "$$@"' >> list_people_python
>     @chmod +x list_people_python
> </ExampleMakefile>
>
>> Date: Thu, 28 Feb 2013 02:48:08 -0500
>> Subject: Re: [protobuf] Linker error
>> From: imir...@alum.mit.edu
>> To: farhan1...@hotmail.com
>> CC: protobuf@googlegroups.com
>
>>
>> You don't appear to include the path to protobuf when compiling
>> user.pb.o -- there's no explicit rule so it'll just $(CXXFLAGS). You
>> should either add
>>
>> %.pb.o: %.pb.cc
>> $(CC) $(CXXFLAGS) $(pkgconfig --cflags protobuf) -o $@ $^
>>
>> Or add CXXFLAGS = $(pkgconfig --cflags protobuf) at the top, which
>> will make it add the include path everywhere. (I note you're using
>> CFLAGS... afaik that doesn't get used by the default c++ compilation
>> rule. Take a look at the commands make prints out and make sure
>> they're what you'd expect.) Also you'll need this when compiling
>> hello_protobuf.o, since it also needs the protobuf library.
>>
>> If the above doesn't explain the issue, you might paste the whole
>> output from make which will include the actual commands being run.
>>
>> -ilia
>>
>> On Wed, Feb 27, 2013 at 4:01 PM, Mohammad Husain <farhan1...@hotmail.com>
>> wrote:
>> > I am having a bizarre linker problem with the simple program I wrote
>> > with
>> > protobuf. When I run the make command I see tons of linker errors like
>> > the
>> > following:
>> >
>> > user.pb.o:(.rodata._ZTIN4misc4UserE[_ZTIN4misc4UserE]+0x10): undefined
>> > reference to `typeinfo for google::protobuf::Message'
>> >
>> > user.pb.o:(.rodata._ZTIN4misc13User_FullNameE[_ZTIN4misc13User_FullNameE]+0x0):
>> > undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
>> >
>> > user.pb.o:(.rodata._ZTIN4misc13User_FullNameE[_ZTIN4misc13User_FullNameE]+0x10):
>> > undefined reference to `typeinfo for google::protobuf::Message'
>> > user.pb.o:(.eh_frame+0x38b): undefined reference to
>> > `__gxx_personality_v0'
>> > collect2: error: ld returned 1 exit status
>> > make: *** [hello_protobuf] Error 1
>> >
>> > However, the C++ example in the protobuf package builds and runs fine.
>> > Here
>> > is the output of the pkgconfig command:
>> >
>> > $ pkg-config --cflags --libs protobuf
>> > -pthread -I/usr/local/include -pthread -L/usr/local/lib -lprotobuf -lz
>> > -lpthread
>> > $ protoc --version
>> > libprotoc 2.4.1
>> > I am using version 2.4.1. I believe something is wrong with my Makefile.
>> > Can
>> > anyone help?
>> >
>> > I tried to attach the source and Makefile but probably attachment is
>> > disabled in the group. Here are my file contents:
>> >
>> > <user.proto>
>> > package misc;
>> >
>> > message User {
>> > required string username = 1;
>> > required int32 id = 2;
>> > optional string email = 3;
>> >
>> > message FullName {
>> > required string firstName = 1;
>> > optional string middleName = 2;
>> > required string lastName = 3;
>> > }
>> >
>> > optional FullName fullName = 4;;
>> > }
>> > </user.proto>
>> >
>> > <hello_protobuf.cpp>
>> > #include <iostream>
>> > #include "user.pb.h"
>> >
>> > int main(int argc, char **argv) {
>> > misc::User u;
>> >
>> > u.set_username("username");
>> > u.set_id(1);
>> >
>> > std::cout << "Username: " << u.username() << " and ID: " << u.id() <<
>> > std::endl;
>> >
>> > return 0;
>> > }
>> > </hello_protobuf.cpp>
>> >
>> > <Makefile>
>> > all: hello_protobuf
>> >
>> > CC = g++
>> > DEBUG = -g
>> > LIBS = `pkg-config --cflags --libs protobuf`
>> > CFLAGS = -Wall $(DEBUG)
>> > LFLAGS = -Wall $(DEBUG) $(LIBS)
>> >
>> > protoc_middleman: user.proto
>> > protoc --cpp_out=. user.proto
>> > @touch protoc_middleman
>> >
>> > OBJS = hello_protobuf.o user.pb.o
>> >
>> > hello_protobuf: $(OBJS) protoc_middleman
>> > pkg-config --cflags protobuf # fails if protobuf is not installed
>> > $(CC) $(LFLAGS) $(OBJS) -o hello_protobuf
>> >
>> > clean:
>> > \rm *.o hello_protobuf
>> > </Makefile>
>> >
>> > --
>> > 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 protobuf+unsubscr...@googlegroups.com.
>> > To post to this group, send email to protobuf@googlegroups.com.
>> > Visit this group at http://groups.google.com/group/protobuf?hl=en.
>> > For more options, visit https://groups.google.com/groups/opt_out.
>> >
>> >

-- 
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 protobuf+unsubscr...@googlegroups.com.
To post to this group, send email to protobuf@googlegroups.com.
Visit this group at http://groups.google.com/group/protobuf?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to