c++ - 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++
但是在执行生成的二进制文件时,它会在库中给出浮点异常。
问题:
- 和图书馆有什么
floating point exception
关系? - 我们认为这可能是 C 到 C++ 转换的问题,但是当使用相同的包装 API 将相同的 C 代码转换为 C++ 时。给出
floating point exception
.Now 如果我们用直接库 API 替换包装器 APIgrpc++
,在 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
选项,但问题与上面有些相似。
解决方案
推荐阅读
- pandas - 在 Pyspark 中按级别绘制直方图
- reactjs - 对至少一个值为真的对象数组进行 YUP 验证
- python - 这个 MB/s 公式对吗?Python
- python - 在python中存储自定义对象字典的最佳方法?
- python - Pandas:从另一个数据帧更新数据帧中的特定值
- javascript - 子组件不识别道具从父组件更改
- ruby-on-rails - 如何检查不同国家/地区的字符串中的特殊字符?
- google-cloud-platform - GCP Terraform google_project_iam_member 不会将手动添加的角色删除到成员
- typescript - '{ pathname: string; 类型的参数 装运:TSshipment;}' 不可分配给“To”类型的参数
- hashicorp-vault - Vault 中转引擎自动开封在启动时未通过 VAULT_TOKEN?