Справочная информация:
Библиотека C ++ для etcd client
, имеющая API для взаимодействия с 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
.
Теперь, используя эту библиотеку API etcd_c++
, написал код 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 ++, но при преобразовании того же кода C в C ++ с тем же API-оболочкой.Дает
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++
EDIT : Некоторые выводы, https://bugs.launchpad.net/ubuntu/+source/grpc/+bug/1797000
ХотяМы не используем опцию -Wl,-Bsymbolic-functions
, но проблема в чем-то похожа на описанную выше.