首页 > 解决方案 > C++ 共享库在与 C 应用程序链接时给出浮点异常

问题描述

背景:

etcd client一个用于与 API 进行通信的 C++ 库etcd server,为了在 C 应用程序中使用这个库,我们在这个库上编写了 C++ 包装器,以便它可以被 C 应用程序调用。

使用以下命令创建了一个共享库:

g++-7 -ggdb -fPIC -shared -o libetcd_c++.so etcd_client_wrapper.cc etcd_client_txn_wrapper.cc etcd_client.cc etcd_client_txn.cc utils/string.cc pb/*.cc -std=c++1z -I ./pb/etcd -rdynamic -Wl,-call_shared -lglog -lprotobuf -lgrpc++ -lgrpc -Wl,-call_shared -lpthread -ldl -lc

将此库放置到默认库路径/usr/local/lib并使用sudo ldconfig.

现在使用这个etcd_c++库 API,编写了一个 C 代码来将简单的键值插入到etcd keyspace. 使用以下命令编译:

gcc -ggdb -o cwrap sample_wrapper.c -rdynamic -pthread -static-libstdc++ -Wl,-non_shared -lglog -lprotobuf -pthread -lz -lgrpc++ -lprotobuf -lgrpc -lz -lcares -lssl -lcrypto -lunwind -llzma -lgflags -Wl,-call_shared -lpthread -ldl -letcd_c++ -lstdc++

编译顺利。grpc++但是在执行生成的二进制文件时,它会在库中给出浮点异常。

问题:

  1. 和图书馆有什么floating point exception关系?
  2. 我们认为这可能是 C 到 C++ 转换的问题,但是当使用相同的包装 API 将相同的 C 代码转换为 C++ 时。给出floating point exception.Now 如果我们用直接库 API 替换包装器 API grpc++,在 C++ 代码中,它可以正常工作。是链接问题吗?

编译 C++ 应用程序:

g++-7 -ggdb -o wrap example.cc -std=c++1z -rdynamic -pthread -static-libstdc++ -Wl,-non_shared -lglog -lprotobuf -pthread -lz -lgrpc++ -lprotobuf -lgrpc -lz -lcares -lssl -lcrypto -lunwind -llzma -lgflags -Wl,-call_shared -lpthread -ldl -letcd_c++

编辑:一些发现,https ://bugs.launchpad.net/ubuntu/+source/grpc/+bug/1797000

虽然我们没有使用-Wl,-Bsymbolic-functions选项,但问题与上面有些相似。

标签: c++cshared-librariesgrpcetcd3

解决方案


推荐阅读