I added that but nothing changed :( > Date: Thu, 28 Feb 2013 17:13:57 -0500 > Subject: Re: [protobuf] Linker error > From: [email protected] > To: [email protected] > CC: [email protected] > > There's a -c missing... the line should be like > > $(CXX) $(CXXFLAGS) `pkg-config --cflags protobuf` -c -o $@ $^ > > On Thu, Feb 28, 2013 at 5:08 PM, Mohammad Husain <[email protected]> > wrote: > > 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. > >
-- 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.
