簡體   English   中英

無法編譯 grpc c++ helloworld 示例

[英]Cannot compile grpc c++ helloworld example

我使用 Ubuntu 20.04 和以下 OpenSSL 版本:

nirupamix@nirupamix:~grpc/examples/cpp/helloworld/cmake/build ((v1.41.1))$ openssl version
OpenSSL 1.1.1f  31 Mar 2020

我使用 cmake/make/make install 從 github 安裝了 grpc (v.1.41.1),然后嘗試編譯 example/cpp/helloworld。 我遇到了一個涉及 OpenSSL 的錯誤,我無法解決:

nirupamix@nirupamix:~/grpc/examples/cpp/helloworld/cmake/build ((v1.41.1))$ make
[  5%] Generating helloworld.pb.cc, helloworld.pb.h, helloworld.grpc.pb.cc, helloworld.grpc.pb.h
Scanning dependencies of target hw_grpc_proto
[ 11%] Building CXX object CMakeFiles/hw_grpc_proto.dir/helloworld.grpc.pb.cc.o
[ 16%] Building CXX object CMakeFiles/hw_grpc_proto.dir/helloworld.pb.cc.o
[ 22%] Linking CXX static library libhw_grpc_proto.a
[ 22%] Built target hw_grpc_proto
Scanning dependencies of target greeter_async_client2
[ 27%] Building CXX object CMakeFiles/greeter_async_client2.dir/greeter_async_client2.cc.o
[ 33%] Linking CXX executable greeter_async_client2
/usr/bin/ld: /usr/local/lib/libgrpc.a(json_token.cc.o): in function `compute_and_encode_signature(grpc_auth_json_key const*, char const*, char const*)':
json_token.cc:(.text+0xedb): undefined reference to `EVP_MD_CTX_create'
/usr/bin/ld: json_token.cc:(.text+0xf98): undefined reference to `EVP_DigestSignUpdate'
/usr/bin/ld: json_token.cc:(.text+0x10a5): undefined reference to `EVP_MD_CTX_destroy'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `init_openssl()':
ssl_transport_security.cc:(.text+0x32): undefined reference to `SSL_CTX_get_ex_new_index'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `peer_property_from_x509_common_name(x509_st*, tsi_peer_property*)':
ssl_transport_security.cc:(.text+0x5c5): undefined reference to `OPENSSL_free'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `add_pem_certificate(x509_st*, tsi_peer_property*)':
ssl_transport_security.cc:(.text+0x654): undefined reference to `BIO_get_mem_data'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `add_subject_alt_names_properties_to_peer(tsi_peer*, stack_st_GENERAL_NAME*, unsigned long, int*)':
ssl_transport_security.cc:(.text+0x8f3): undefined reference to `OPENSSL_free'
/usr/bin/ld: ssl_transport_security.cc:(.text+0x96f): undefined reference to `OPENSSL_free'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `ssl_ctx_use_certificate_chain(ssl_ctx_st*, char const*, unsigned long)':
ssl_transport_security.cc:(.text+0x12e8): undefined reference to `SSL_CTX_add_extra_chain_cert'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `populate_ssl_context(ssl_ctx_st*, tsi_ssl_pem_key_cert_pair const*, char const*)':
ssl_transport_security.cc:(.text+0x192f): undefined reference to `SSL_CTX_set_tmp_ecdh'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `tsi_set_min_and_max_tls_versions(ssl_ctx_st*, tsi_tls_version, tsi_tls_version)':
ssl_transport_security.cc:(.text+0x1cf0): undefined reference to `SSL_CTX_set_min_proto_version'
/usr/bin/ld: ssl_transport_security.cc:(.text+0x1d03): undefined reference to `SSL_CTX_set_min_proto_version'
/usr/bin/ld: ssl_transport_security.cc:(.text+0x1d4d): undefined reference to `SSL_CTX_set_max_proto_version'
/usr/bin/ld: ssl_transport_security.cc:(.text+0x1d60): undefined reference to `SSL_CTX_set_max_proto_version'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `ssl_protector_protect(tsi_frame_protector*, unsigned char const*, unsigned long*, unsigned char*, unsigned long*)':
ssl_transport_security.cc:(.text+0x2040): undefined reference to `BIO_pending'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `ssl_protector_protect_flush(tsi_frame_protector*, unsigned char*, unsigned long*, unsigned long*)':
ssl_transport_security.cc:(.text+0x233a): undefined reference to `BIO_pending'
/usr/bin/ld: ssl_transport_security.cc:(.text+0x2453): undefined reference to `BIO_pending'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `tsi_ssl_get_cert_chain_contents(stack_st_X509*, tsi_peer_property*)':
ssl_transport_security.cc:(.text+0x28b4): undefined reference to `BIO_get_mem_data'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `ssl_handshaker_get_bytes_to_send_to_peer(tsi_ssl_handshaker*, unsigned char*, unsigned long*)':
ssl_transport_security.cc:(.text+0x2ff8): undefined reference to `BIO_should_retry'
/usr/bin/ld: ssl_transport_security.cc:(.text+0x3039): undefined reference to `BIO_pending'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `ssl_handshaker_process_bytes_from_peer(tsi_ssl_handshaker*, unsigned char const*, unsigned long*)':
ssl_transport_security.cc:(.text+0x327f): undefined reference to `BIO_pending'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `ssl_bytes_remaining(tsi_ssl_handshaker*, unsigned char**, unsigned long*)':
ssl_transport_security.cc:(.text+0x33de): undefined reference to `BIO_pending'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `create_tsi_ssl_handshaker(ssl_ctx_st*, int, char const*, tsi_ssl_handshaker_factory*, tsi_handshaker**)':
ssl_transport_security.cc:(.text+0x3918): undefined reference to `SSL_set_tlsext_host_name'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `tsi_create_ssl_client_handshaker_factory_with_options(tsi_ssl_client_handshaker_options const*, tsi_ssl_client_handshaker_factory**)':
ssl_transport_security.cc:(.text+0x4739): undefined reference to `SSL_CTX_set_session_cache_mode'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `tsi_create_ssl_server_handshaker_factory_with_options(tsi_ssl_server_handshaker_options const*, tsi_ssl_server_handshaker_factory**)':
ssl_transport_security.cc:(.text+0x4e1a): undefined reference to `SSL_CTX_set_tlsext_ticket_keys'
/usr/bin/ld: ssl_transport_security.cc:(.text+0x5073): undefined reference to `SSL_CTX_set_tlsext_servername_callback'
/usr/bin/ld: ssl_transport_security.cc:(.text+0x5098): undefined reference to `SSL_CTX_set_tlsext_servername_arg'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `sk_X509_NAME_new_null':
ssl_transport_security.cc:(.text.sk_X509_NAME_new_null[sk_X509_NAME_new_null]+0x9): undefined reference to `sk_new_null'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `sk_X509_NAME_pop_free':
ssl_transport_security.cc:(.text.sk_X509_NAME_pop_free[sk_X509_NAME_pop_free]+0x2a): undefined reference to `sk_pop_free_ex'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `sk_X509_NAME_push':
ssl_transport_security.cc:(.text.sk_X509_NAME_push[sk_X509_NAME_push]+0x23): undefined reference to `sk_push'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `sk_X509_num':
ssl_transport_security.cc:(.text.sk_X509_num[sk_X509_num]+0x18): undefined reference to `sk_num'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `sk_X509_value':
ssl_transport_security.cc:(.text.sk_X509_value[sk_X509_value]+0x23): undefined reference to `sk_value'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `sk_GENERAL_NAME_num':
ssl_transport_security.cc:(.text.sk_GENERAL_NAME_num[sk_GENERAL_NAME_num]+0x18): undefined reference to `sk_num'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `sk_GENERAL_NAME_value':
ssl_transport_security.cc:(.text.sk_GENERAL_NAME_value[sk_GENERAL_NAME_value]+0x23): undefined reference to `sk_value'
/usr/bin/ld: /usr/local/lib/libgrpc.a(ssl_transport_security.cc.o): in function `sk_GENERAL_NAME_pop_free':
ssl_transport_security.cc:(.text.sk_GENERAL_NAME_pop_free[sk_GENERAL_NAME_pop_free]+0x2a): undefined reference to `sk_pop_free_ex'
/usr/bin/ld: /usr/local/lib/libgrpc.a(aes_gcm.cc.o): in function `aes_gcm_get_openssl_errors()':
aes_gcm.cc:(.text+0x57): undefined reference to `BIO_get_mem_ptr'
/usr/bin/ld: /usr/local/lib/libcrypto.a(dso_dlfcn.o): in function `dlfcn_globallookup':
dso_dlfcn.c:(.text+0x17): undefined reference to `dlopen'
/usr/bin/ld: dso_dlfcn.c:(.text+0x2a): undefined reference to `dlsym'
/usr/bin/ld: dso_dlfcn.c:(.text+0x35): undefined reference to `dlclose'
/usr/bin/ld: /usr/local/lib/libcrypto.a(dso_dlfcn.o): in function `dlfcn_bind_func':
dso_dlfcn.c:(.text+0x1b7): undefined reference to `dlsym'
/usr/bin/ld: dso_dlfcn.c:(.text+0x282): undefined reference to `dlerror'
/usr/bin/ld: /usr/local/lib/libcrypto.a(dso_dlfcn.o): in function `dlfcn_load':
dso_dlfcn.c:(.text+0x2f5): undefined reference to `dlopen'
/usr/bin/ld: dso_dlfcn.c:(.text+0x369): undefined reference to `dlclose'
/usr/bin/ld: dso_dlfcn.c:(.text+0x3a5): undefined reference to `dlerror'
/usr/bin/ld: /usr/local/lib/libcrypto.a(dso_dlfcn.o): in function `dlfcn_pathbyaddr':
dso_dlfcn.c:(.text+0x466): undefined reference to `dladdr'
/usr/bin/ld: dso_dlfcn.c:(.text+0x4d7): undefined reference to `dlerror'
/usr/bin/ld: /usr/local/lib/libcrypto.a(dso_dlfcn.o): in function `dlfcn_unload':
dso_dlfcn.c:(.text+0x6b8): undefined reference to `dlclose'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/greeter_async_client2.dir/build.make:127: greeter_async_client2] Error 1
make[1]: *** [CMakeFiles/Makefile2:90: CMakeFiles/greeter_async_client2.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

有沒有人遇到過這樣的事情? 提前致謝!

您是否嘗試遵循快速入門指南

它對我來說非常有效。

  • 安裝 選擇一個目錄來保存本地安裝的包。 此頁面假定環境變量 MY_INSTALL_DIR 保存此目錄路徑。 例如:

    $ export MY_INSTALL_DIR=$HOME/.local

確保目錄存在:

 $ mkdir -p $MY_INSTALL_DIR

將本地 bin 文件夾添加到路徑變量,例如:

 $ export PATH="$MY_INSTALL_DIR/bin:$PATH"

安裝 cmake 您需要 3.13 或更高版本的 cmake。 按照以下說明安裝它:

Linux:

 $ sudo apt install -y cmake

蘋果系統:

 $ brew install cmake

有關一般 cmake 安裝說明,請參閱安裝 CMake。

查看cmake的版本:

 $ cmake --version cmake version 3.19.6

在 Linux 下,系統范圍的 cmake 的版本通常可能太舊。 您可以將更新的版本安裝到本地安裝目錄中,如下所示:

 $ wget -q -O cmake-linux.sh https://github.com/Kitware/CMake/releases/download/v3.19.6/cmake-3.19.6-Linux-x86_64.sh $ sh cmake-linux.sh -- --skip-license --prefix=$MY_INSTALL_DIR $ rm cmake-linux.sh

安裝其他所需工具 安裝構建 gRPC 所需的基本工具:

Linux:

 $ sudo apt install -y build-essential autoconf libtool pkg-config

蘋果系統:

 $ brew install autoconf automake libtool pkg-config

克隆 grpc 存儲庫 克隆 grpc 存儲庫及其子模塊:

 $ git clone --recurse-submodules -b v1.42.0 https://github.com/grpc/grpc

構建和安裝 gRPC 和協議緩沖區雖然不是強制性的,但 gRPC 應用程序通常利用協議緩沖區進行服務定義和數據序列化,示例代碼使用 proto3。

以下命令構建並在本地安裝 gRPC 和協議緩沖區:

 $ cd grpc $ mkdir -p cmake/build $ pushd cmake/build $ cmake -DgRPC_INSTALL=ON \ -DgRPC_BUILD_TESTS=OFF \ -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \../.. $ make -j $ make install $ popd

重要我們強烈建議您在本地安裝 gRPC — 使用適當設置的 CMAKE_INSTALL_PREFIX — 因為在全局安裝 gRPC 后沒有簡單的方法可以卸載它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM