背景:
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
选项,但问题与上面有些相似。