I tried that but unfortunately no luck yet: http://pastebin.com/Ln4AC7fH.
> Date: Thu, 28 Feb 2013 17:00:21 -0500 > Subject: Re: [protobuf] Linker error > From: [email protected] > To: [email protected] > CC: [email protected] > > Hmmm... I must have misremembered how Makefile stuff works, my bad. > Instead of $(pkg-config --cflags protobuf) try `pkg-config --cflags > protobuf`. (There's some way to evaluate stuff in the Makefile > directly, but apparently $() isn't it -- that's the sh way...) > > On Thu, Feb 28, 2013 at 4:57 PM, Mohammad Husain <[email protected]> > wrote: > > I just tried your suggestion (copied the Makefile below). The errors are > > still there :(. I have pasted the output here: > > > > http://pastebin.com/S8K9WzK0 > > > > <Makefile> > > all: hello_protobuf > > > > # CC = g++ > > > > DEBUG = -g > > LIBS = `pkg-config --cflags --libs protobuf` > > LFLAGS = -Wall $(DEBUG) $(LIBS) > > > > protoc_middleman: user.proto > > protoc --cpp_out=. user.proto > > @touch protoc_middleman > > > > %.pb.o: %.pb.cc > > $(CXX) $(CXXFLAGS) $(pkgconfig --cflags protobuf) -o $@ $^ > > > > > > OBJS = hello_protobuf.o user.pb.o > > > > hello_protobuf: $(OBJS) protoc_middleman > > pkg-config --cflags protobuf # fails if protobuf is not installed > > $(CXX) $(LFLAGS) -o hello_protobuf $(OBJS) > > > > clean: > > \rm *.o > > \rm hello_protobuf 2>/dev/null || true > > </Makefile> > > > >> Date: Thu, 28 Feb 2013 15:41:00 -0500 > > > >> Subject: Re: [protobuf] Linker error > >> From: [email protected] > >> To: [email protected] > >> CC: [email protected] > >> > >> 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 <[email protected]> > >> 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: [email protected] > >> >> To: [email protected] > >> >> CC: [email protected] > >> > > >> >> > >> >> 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 > >> >> <[email protected]> > >> >> 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 [email protected]. > >> >> > To post to this group, send email to [email protected]. > >> >> > 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 [email protected]. > >> To post to this group, send email to [email protected]. > >> 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 [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/protobuf?hl=en. For more options, visit https://groups.google.com/groups/opt_out.
