devsisters / goquic

QUIC support for Go
http://devsisters.github.io/goquic/
BSD 3-Clause "New" or "Revised" License
944 stars 100 forks source link

Build failed with "undefined reference to `net::CachedNetworkParameters::..." #18

Closed henning77 closed 8 years ago

henning77 commented 8 years ago

I tried to build example/server.go with the following options:

CGO_CFLAGS="-I$GOPATH/src/github.com/devsisters/goquic/libquic/boringssl/include" CGO_LDFLAGS="-L$GOPATH/src/github.com/devsisters/goquic/lib/linux_amd64" go build $GOPATH/src/github.com/devsisters/goquic/example/server.go

Result:

# CGO_CFLAGS="-I$GOPATH/src/github.com/devsisters/goquic/libquic/boringssl/include" CGO_LDFLAGS="-L$GOPATH/src/github.com/devsisters/goquic/lib/linux_amd64" go build $GOPATH/src/github.com/devsisters/goquic/example/server.go
# github.com/devsisters/goquic
src/github.com/devsisters/goquic/lib/linux_amd64/libgoquic.a(go_quic_server_session_base.o): In function `net::tools::GoQuicServerSessionBase::OnCongestionWindowChange(net::QuicTime)':
src/github.com/devsisters/goquic/src/go_quic_server_session_base.cc:155: undefined reference to `net::CachedNetworkParameters::CachedNetworkParameters()'
src/github.com/devsisters/goquic/src/go_quic_server_session_base.cc:179: undefined reference to `net::CachedNetworkParameters::~CachedNetworkParameters()'
src/github.com/devsisters/goquic/src/go_quic_server_session_base.cc:179: undefined reference to `net::CachedNetworkParameters::~CachedNetworkParameters()'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(quic_crypto_server_config.cc.o): In function `net::ValidateClientHelloResultCallback::Result::Result(net::CryptoHandshakeMessage const&, std::vector<unsigned char, std::allocator<unsigned char> >, net::QuicWallTime)':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/crypto/quic_crypto_server_config.cc:186: undefined reference to `net::CachedNetworkParameters::CachedNetworkParameters()'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(quic_crypto_server_config.cc.o): In function `net::ValidateClientHelloResultCallback::Result::~Result()':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/crypto/quic_crypto_server_config.cc:188: undefined reference to `net::CachedNetworkParameters::~CachedNetworkParameters()'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(quic_crypto_server_config.cc.o): In function `net::CachedNetworkParameters::operator=(net::CachedNetworkParameters const&)':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/proto/cached_network_parameters.pb.h:57: undefined reference to `net::CachedNetworkParameters::CopyFrom(net::CachedNetworkParameters const&)'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(quic_crypto_server_config.cc.o): In function `net::SourceAddressToken::mutable_cached_network_parameters()':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/proto/source_address_token.pb.h:358: undefined reference to `net::CachedNetworkParameters::CachedNetworkParameters()'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(quic_crypto_server_stream.cc.o): In function `net::QuicCryptoServerStream::SetPreviousCachedNetworkParams(net::CachedNetworkParameters)':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/quic_crypto_server_stream.cc:280: undefined reference to `net::CachedNetworkParameters::CachedNetworkParameters(net::CachedNetworkParameters const&)'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(quic_crypto_server_stream.cc.o): In function `net::QuicCryptoServerStream::ProcessClientHello(net::CryptoHandshakeMessage const&, net::ValidateClientHelloResultCallback::Result const&, net::CryptoHandshakeMessage*, std::string*)':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/quic_crypto_server_stream.cc:324: undefined reference to `net::CachedNetworkParameters::CachedNetworkParameters(net::CachedNetworkParameters const&)'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(source_address_token.pb.cc.o): In function `net::protobuf_AddDesc_source_5faddress_5ftoken_2eproto()':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/proto/source_address_token.pb.cc:34: undefined reference to `net::protobuf_AddDesc_cached_5fnetwork_5fparameters_2eproto()'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(source_address_token.pb.cc.o): In function `net::SourceAddressToken::InitAsDefaultInstance()':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/proto/source_address_token.pb.cc:75: undefined reference to `net::CachedNetworkParameters::default_instance()'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(source_address_token.pb.cc.o): In function `net::SourceAddressToken::Clear()':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/proto/source_address_token.pb.cc:139: undefined reference to `net::CachedNetworkParameters::Clear()'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(source_address_token.pb.cc.o): In function `net::SourceAddressToken::MergeFrom(net::SourceAddressToken const&)':
src/github.com/devsisters/goquic/libquic/build/../src/net/quic/proto/source_address_token.pb.cc:277: undefined reference to `net::CachedNetworkParameters::MergeFrom(net::CachedNetworkParameters const&)'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(source_address_token.pb.cc.o): In function `bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<net::CachedNetworkParameters>(google::protobuf::io::CodedInputStream*, net::CachedNetworkParameters*)':
src/github.com/devsisters/goquic/libquic/build/../src/third_party/protobuf/src/google/protobuf/wire_format_lite_inl.h:402: undefined reference to `net::CachedNetworkParameters::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)'
src/github.com/devsisters/goquic/lib/linux_amd64/libquic.a(source_address_token.pb.cc.o): In function `int google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual<net::CachedNetworkParameters>(net::CachedNetworkParameters const&)':
src/github.com/devsisters/goquic/libquic/build/../src/third_party/protobuf/src/google/protobuf/wire_format_lite_inl.h:765: undefined reference to `net::CachedNetworkParameters::ByteSize() const'
collect2: error: ld returned 1 exit status

I'm on linux + go1.6. Previously I have build the static libs with ./build_libs.sh, without problem.

Eimji commented 8 years ago

Hello,

Try to do the following: go get -u /github.com/devsisters/goquic cd $GOPATH/src/github.com/devsisters/goquic ./build_libs.sh Now compile with CGO_LDFLAGS="-L$GOPATH/src/github.com/devsisters/goquic/lib/linux_amd64" go build $GOPATH/src/github.com/devsisters/goquic/example/server.go

On my machine Debian Jessie with golang1.6, I got the following error when running my QUIC server: "panic: runtime error: cgo argument has Go pointer to Go pointer" But it seems that this error is due to the Golang bug: https://github.com/golang/go/issues/14210

henning77 commented 8 years ago

@Eimji I tried your sequence, but it yields the same errors. Maybe I need to change the build environment? To be exact, I am inside a Ubuntu 14.04 Docker container.

henning77 commented 8 years ago

Now I tried to build on OSX, but get basically the same errors (slightly different error message). ./build_libs.sh executed successfully.

$ CGO_CFLAGS="-I$GOPATH/src/github.com/devsisters/goquic/libquic/boringssl/include" CGO_LDFLAGS="-L$GOPATH/src/github.com/devsisters/goquic/lib/darwin_amd64" go build $GOPATH/src/github.com/devsisters/goquic/example/server.go
# github.com/devsisters/goquic
Undefined symbols for architecture x86_64:
  "net::CachedNetworkParameters::default_instance()", referenced from:
      net::SourceAddressToken::InitAsDefaultInstance() in libquic.a(source_address_token.pb.cc.o)
  "net::CachedNetworkParameters::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)", referenced from:
      bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<net::CachedNetworkParameters>(google::protobuf::io::CodedInputStream*, net::CachedNetworkParameters*) in libquic.a(source_address_token.pb.cc.o)
  "net::CachedNetworkParameters::Clear()", referenced from:
      net::SourceAddressToken::Clear() in libquic.a(source_address_token.pb.cc.o)
  "net::CachedNetworkParameters::CopyFrom(net::CachedNetworkParameters const&)", referenced from:
      net::CachedNetworkParameters::operator=(net::CachedNetworkParameters const&) in libquic.a(quic_crypto_server_config.cc.o)
  "net::CachedNetworkParameters::MergeFrom(net::CachedNetworkParameters const&)", referenced from:
      net::SourceAddressToken::MergeFrom(net::SourceAddressToken const&) in libquic.a(source_address_token.pb.cc.o)
  "net::CachedNetworkParameters::CachedNetworkParameters(net::CachedNetworkParameters const&)", referenced from:
      net::QuicCryptoServerStream::SetPreviousCachedNetworkParams(net::CachedNetworkParameters) in libquic.a(quic_crypto_server_stream.cc.o)
      net::QuicCryptoServerStream::ProcessClientHello(net::CryptoHandshakeMessage const&, net::ValidateClientHelloResultCallback::Result const&, net::CryptoHandshakeMessage*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*) in libquic.a(quic_crypto_server_stream.cc.o)
  "net::CachedNetworkParameters::CachedNetworkParameters()", referenced from:
      net::ValidateClientHelloResultCallback::Result::Result(net::CryptoHandshakeMessage const&, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >, net::QuicWallTime) in libquic.a(quic_crypto_server_config.cc.o)
      net::SourceAddressToken::mutable_cached_network_parameters() in libquic.a(quic_crypto_server_config.cc.o)
      net::SourceAddressToken::mutable_cached_network_parameters() in libquic.a(source_address_token.pb.cc.o)
      net::tools::GoQuicServerSessionBase::OnCongestionWindowChange(net::QuicTime) in libgoquic.a(go_quic_server_session_base.o)
  "net::CachedNetworkParameters::~CachedNetworkParameters()", referenced from:
      net::ValidateClientHelloResultCallback::Result::~Result() in libquic.a(quic_crypto_server_config.cc.o)
      net::tools::GoQuicServerSessionBase::OnCongestionWindowChange(net::QuicTime) in libgoquic.a(go_quic_server_session_base.o)
  "net::protobuf_AddDesc_cached_5fnetwork_5fparameters_2eproto()", referenced from:
      net::protobuf_AddDesc_source_5faddress_5ftoken_2eproto() in libquic.a(source_address_token.pb.cc.o)
  "net::CachedNetworkParameters::ByteSize() const", referenced from:
      int google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual<net::CachedNetworkParameters>(net::CachedNetworkParameters const&) in libquic.a(source_address_token.pb.cc.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
henning77 commented 8 years ago

Turned out the issue was that I built from a shared folder inside my VM (shared with host). I started from scratch on a folder inside the VM and now it works.

hodduc commented 8 years ago

I'm glad to hear it :+1: