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.


Reply via email to