質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Protocol Buffers

Protocol Buffersは、Googleが開発しているシリアライズフォーマットです。インタフェース定義言語 (IDL) で構造を定義する通信・永続化を目的としています。元々のGoogleの実装にはC++/Java/Pythonを使用。オープンソースのフリーソフトウェアです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

275閲覧

[Protocol Buffers] 実行エラー ../sysdeps/unix/sysv/linux/raise.c:が見つかりません の原因と対処方法が知りたい

samidare_chan

総合スコア18

Protocol Buffers

Protocol Buffersは、Googleが開発しているシリアライズフォーマットです。インタフェース定義言語 (IDL) で構造を定義する通信・永続化を目的としています。元々のGoogleの実装にはC++/Java/Pythonを使用。オープンソースのフリーソフトウェアです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/03/07 09:38

質問内容

以下の提示コードですがコンパイルしてMain.cppに組み込みコンパイルして実行すると
以下のエラーが出ますこれは何が原因なのでしょうか?../sysdeps/unix/sysv/linux/raise.cについて調べましたがライブラリではないようなのでインストールするといった対処方法ではないようでChatGDTに質問しましたが具体的な対処方法がわかりません。

../sysdeps/unix/sysv/linux/raise.c:50 50 ../sysdeps/unix/sysv/linux/raise.c: そのようなファイルやディレクトリはありません.

つまり../sysdeps/unix/sysv/linux/raise.c:は一体なんでしょうか?

実現したいこと

エラー原因と対処方法が知りたい

前提

OS: ubuntu
言語: C++

protoc version:

> protoc --version libprotoc 3.6.1

発生している問題・エラーメッセージ

> ./my_program 18:07:54 terminate called after throwing an instance of 'std::system_error' what(): Unknown error -1 fish: './my_program' terminated by signal SIGABRT (Abort)

該当のソースコード

Main.cpp

cpp

1#include <iostream> 2#include "sample.pb.h" 3 4int main() 5{ 6 std::cout<<std::system_error().what()<<std::endl; 7 Human::Person person; 8 9 person.set_name("John Doe"); 10 person.set_id(123); 11 12 // Serialize the Person message to a string 13 std::string serialized_data; 14 person.SerializeToString(&serialized_data); 15 16 std::cout<<serialized_data<<std::endl; 17 // Deserialize the string back to a Person message 18 Human::Person deserialized_person; 19 deserialized_person.ParseFromString(serialized_data); 20 21 // Print the deserialized data 22 std::cout << "Name: " << deserialized_person.name() << std::endl; 23 std::cout << "ID: " << deserialized_person.id() << std::endl; 24 25 return 0; 26}
sample.proto
syntax = "proto3"; package Human; message Person { string name = 1; int32 id = 2; }
test.proto
syntax = "proto3"; import "sample.proto"; message Test { Human.Person human = 1; }

試したこと

実行したコマンド
> g++ Main.cpp sample.pb.cc test.pb.cc -o my_program -lprotobuf > ./my_program
> gdb
terminate called after throwing an instance of 'std::system_error' what(): Unknown error -1 Program received signal SIGABRT, Aborted. __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 50 ../sysdeps/unix/sysv/linux/raise.c: そのようなファイルやディレクトリはありません. (gdb) traceback Undefined command: "traceback". Try "help". (gdb) bt #0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 #1 0x00007ffff78e9859 in __GI_abort () at abort.c:79 #2 0x00007ffff7b728d1 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #3 0x00007ffff7b7e37c in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #4 0x00007ffff7b7e3e7 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #5 0x00007ffff7b7e699 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #6 0x00007ffff7b756fd in std::__throw_system_error(int) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #7 0x00007ffff7dc8c0f in ?? () from /usr/lib/x86_64-linux-gnu/libprotobuf.so.17 #8 0x00007ffff7fe0b9a in call_init (l=<optimized out>, argc=argc@entry=1, argv=argv@entry=0x7fffffffd928, env=env@entry=0x7fffffffd938) at dl-init.c:72 #9 0x00007ffff7fe0ca1 in call_init (env=0x7fffffffd938, argv=0x7fffffffd928, argc=1, l=<optimized out>) at dl-init.c:30 #10 _dl_init (main_map=0x7ffff7ffe190, argc=1, argv=0x7fffffffd928, env=0x7fffffffd938) at dl-init.c:119 #11 0x00007ffff7fd013a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2 #12 0x0000000000000001 in ?? () #13 0x00007fffffffdcf3 in ?? () #14 0x0000000000000000 in ?? ()
Chatgdt 回答
std::system_errorが "Unknown error -1" となっており、それに関連するエラーが見つかっていません。しかし、スタックトレースを見ると、libprotobuf.so.17 からのエラーが発生しているようです。 ここからいくつかの手順を提案します: Protocol Buffersのバージョンの確認: 使用している Protocol Buffers ライブラリが、プログラムで使用している .proto ファイルとの互換性があるか確認してください。バージョンが異なる場合、互換性のないライブラリがエラーを引き起こす可能性があります。 ライブラリの再インストール: Protocol Buffers ライブラリを再インストールしてみてください。Ubuntuの場合、protobuf-compilerとlibprotobuf-devを再インストールすることができます。
参考サイト

A: https://github.com/microsoft/vscode-cpptools/issues/4686

ソースファイルを編

一つづつコメントアウトしてコンパイルして実行を繰り返し実験しましたがインクルードを外すと正常に実行できるため
ProtocolBufferssample.pb.hが原因と考えました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/03/07 10:32

> つまり../sysdeps/unix/sysv/linux/raise.c:は一体なんでしょうか? glibc のソースコードの一部です。例えば、このファイル↓です。 https://elixir.bootlin.com/glibc/glibc-2.33/source/sysdeps/unix/sysv/linux/raise.c glibc の内部で発生したエラーのソースコード上の位置を gdb が表示しようとしているのですが、glibc のソースコードが参照できない(インストールされていない)ので、「そのようなファイルやディレクトリはありません.」 となっています。
samidare_chan

2024/03/07 10:46 編集

ありがとうございます。質問ですが具体的には何が実行エラーの原因でどう対処すればいいのでしょうか? インストールしようとしましたがすでにインストール済みと表示されます ``` > ldd --version 19:45:12 ldd (Ubuntu GLIBC 2.31-0ubuntu9.14) 2.31 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 作者 Roland McGrath および Ulrich Drepper。 ```
melian

2024/03/07 10:53

必要なのはソースコードですので、Ubuntu でしたら、 apt source glibc とします。ただ、ソースコードのパスを gdb に認識させる設定が必要です。
int32_t

2024/03/07 12:40 編集

protoc や libprotobuf をどうやってインストールしましたか? pkg-config --shared --cflags --libs protobuf を実行して何か表示されますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問