kentar_f
2022年3月27日 15時24分
お世話になります、
Armadilloを使用して間もなく、またLinuxの方は全然知識がありません。
OSのないマイコンの方は経験が長いです。
ATDE7を使用し、クロスコンパイルを行っています。
マニュアルを片手に、SIMの設定やLANの接続、USBメモリのデータ読込などは
動作できるようになりました。
次にVPNでの動作を行いたく、ArmadilloからMongoDBのClientを使用して
VPNにアクセスを行おうとしています。
ただMongo-c-driverがうまくリンクできず困っております。
Mongo-c-driverは、Mongoのインストール手順で公開されているように
下記の手順で行っています。
sudo apt-get install libmongoc-1.0-0
sudo apt-get install libbson-1.0-0
sudo apt-get install cmake libssl-dev libsasl2-dev
sudo wget https://github.com/mongodb/mongo-c-driver/releases/download/1.21.1/mong…
sudo tar xzf mongo-c-driver-1.21.1.tar.gz
cd mongo-c-driver-1.21.1
mkdir cmake-build
cd cmake-build
cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF ..
cmake --build .
cmake --build . --target install
こちらで作成したプログラムをmakeすると、
#include
#include
などはパスするのですが、mongo-c-driverにある関数
例えば mongo_client_new() を呼び出そうとすると
'mongo_client_new' に対する定義されていない参照です。
となり、前に進めず困っております。
的外れな質問であれば申し訳ありません、
何かヒントでもご教示頂けると助かります。
コメント
kentar_f
古賀様、
早速のご回答ありがとうございます。
> 念のため確認ですが、mongo_client_new() ではなく、
> mongoc_client_new() ですよね?
> http://mongoc.org/libmongoc/current/mongoc_client_new.html
失礼いたしました、
mongoc_client_new()のことです。
またインクルードも で実施しています。
当初インクルード先が無いというエラーでしたが、
makeファイルに-I/usr/local/include/libmongoc-1.0/ -I/usr/local/include/libbson-1.0/を
追加してインクルード部分でのエラーは無くなっています。
単に、その実体部分がリンクできていないということでしょうか?
基本的なところで、申し訳ありません。
よろしくお願いいたします。
at_shinya.koga
アットマークテクノの古賀です。
kentar_fさん:
>早速のご回答ありがとうございます。
>
>>念のため確認ですが、mongo_client_new() ではなく、
>>mongoc_client_new() ですよね?
>> http://mongoc.org/libmongoc/current/mongoc_client_new.html
>
>失礼いたしました、
>mongoc_client_new()のことです。
>またインクルードも で実施しています。
了解しました。
>当初インクルード先が無いというエラーでしたが、
>makeファイルに-I/usr/local/include/libmongoc-1.0/ -I/usr/local/include/libbson-1.0/を
>追加してインクルード部分でのエラーは無くなっています。
インクルードパスは追加された、ということですね。
>単に、その実体部分がリンクできていないということでしょうか?
リンクエラーする、ということであれば、これもチュートリアルに記載されているように、-lmongoc-1.0 を指定してライブラリパスを追加すると、どうなるでしょうか?
http://mongoc.org/libmongoc/1.12.0/tutorial.html#include-and-link-libmo…
kentar_f
古賀様
早速のご回答頂きまして、ありがとうございます。
> リンクエラーする、ということであれば、これもチュートリアルに記載されているように、-lmongoc-1.0 を指定してライブラリパスを追加すると、どうなるでしょう
> か?
> http://mongoc.org/libmongoc/1.12.0/tutorial.html#include-and-link-libmo…
例えば、添付のmain.cですと、
<①上記リンクの方法ではエラーとなります>
gcc -o main main.c -I/usr/local/include/libbson-1.0 -I/usr/local/include/libmongoc-1.0 -lmongoc-1.0 -lbson-1.0
<②別サイトにあった下記方法では実行ファイルまで作成可能>
gcc -Wall -o main main.c -lmongoc-1.0 -lbson-1.0 -L/usr/local/lib -I/usr/local/include/libmongoc-1.0/ -I/usr/local/include/libbson-1.0/
<③ ②のgcc部分をarm用に変更するとエラーになります>
arm-linux-gnueabihf-gcc -Wall -o main main.c -lmongoc-1.0 -lbson-1.0 -L/usr/local/lib -I/usr/local/include/libmongoc-1.0/ -I/usr/local/include/libbson-1.0/
エラー内容は、エラー内容.txtを添付しています。
最終的にはArmadilloで実行させたいので、gcc部分をarm-linux-gnueabihf-gccに変更して
いるのですが、そもそも根本的に考え方が間違っているのでしょうか?
ファイル | ファイルの説明 |
---|---|
main.c | |
エラー内容.txt |
at_shinya.koga
アットマークテクノの古賀です。
kentar_fさん:
>>リンクエラーする、ということであれば、これもチュートリアルに記載されているように、-lmongoc-1.0 を指定してライブラリパスを追加すると、どうなるでしょう
>>か?
>> http://mongoc.org/libmongoc/1.12.0/tutorial.html#include-and-link-libmo…
>
>例えば、添付のmain.cですと、
>
><①上記リンクの方法ではエラーとなります>
>gcc -o main main.c -I/usr/local/include/libbson-1.0 -I/usr/local/include/libmongoc-1.0 -lmongoc-1.0 -lbson-1.0
>
><②別サイトにあった下記方法では実行ファイルまで作成可能>
>gcc -Wall -o main main.c -lmongoc-1.0 -lbson-1.0 -L/usr/local/lib -I/usr/local/include/libmongoc-1.0/ -I/usr/local/include/libbson-1.0/
>
><③ ②のgcc部分をarm用に変更するとエラーになります>
>arm-linux-gnueabihf-gcc -Wall -o main main.c -lmongoc-1.0 -lbson-1.0 -L/usr/local/lib -I/usr/local/include/libmongoc-1.0/ -I/usr/local/include/libbson-1.0/
>
>エラー内容は、エラー内容.txtを添付しています。
kentar_fさん(2022年3月27日 15時24分):
>ATDE7を使用し、クロスコンパイルを行っています。
…
>ただMongo-c-driverがうまくリンクできず困っております。
>
>Mongo-c-driverは、Mongoのインストール手順で公開されているように
>下記の手順で行っています。
>sudo apt-get install libmongoc-1.0-0
>sudo apt-get install libbson-1.0-0
…
ATDE 上で libmongoc-1.0-0 や libbson-1.0-0 を apt-get install した場合、x86/x64 用のライブラリがインストールされます。libmongoc を使うアプリケーションを gcc でビルドすると、それら x86/x64 用のライブラリがリンクされますから、エラーなくビルドできますが、生成された実行ファイルは x86/x64 用のバイナリですから、Armadillo では実行できませんよね。
一方、arm-linux-gnueabihf-gcc でビルドした場合、ARM 用の実行ファイルを生成しようとしますが、libmongoc の ARM 用のライブラリが ATDE 上に存在しておらず、インストール済みの x86/x64 用のライブラリをリンクしようとしてもリンクできない、というわけです。添付して頂いた「エラー内容.txt 」にあるエラーメッセージの中に、
/usr/lib/gcc-cross/arm-linux-gnueabihf/6/../../../../arm-linux-gnueabihf/bin/ld: 互換性のないを /usr/local/lib/libmongoc-1.0.so スキップしました (-lmongoc-1.0 を探索している時) ... /usr/lib/gcc-cross/arm-linux-gnueabihf/6/../../../../arm-linux-gnueabihf/bin/ld: 互換性のないを /usr/local/lib/libbson-1.0.so スキップしました (-lbson-1.0 を探索している時)
とあるのは、見つかったライブラリが x86/x64 用のもので、ARM 用のものではないからです。
kentar_fさん(kentar_f):
>最終的にはArmadilloで実行させたいので、gcc部分をarm-linux-gnueabihf-gccに変更して
>いるのですが、そもそも根本的に考え方が間違っているのでしょうか?
というわけで、libmongoc や libbson も ARM 用のものを用意しないといけません。これらは動的/共有ライブラリ(.so)ですから、これらを使うアプリケーションを Armadillo で実行するには、Armadillo にも libmongoc や libbson をインストールしなければいけませんが、Amradillo にインストールした後、Armadillo 上の /usr/local/lib/ に配置された .so を、ATDE の適当なディレクトリにコピーして、そのディレクトリを ATDE でアプリケーションをクロスビルドする際に -L で指定して使う、というのが簡単かも知れません。
または、
(a) アプリケーションを、ATDE でクロスビルドするのではなく、Armadillo 上でセルフビルドする。
(b) libmongoc や libbson を ATDE で ARM 用にクロスビルドして、できたライブラリをリンクする。
のどれかですね。(b) の場合、libmongoc ですと、cmake の -DCMAKE_C_COMPILER で arm-linux-gnueabihf-gcc を指定すればよいようです:
https://github.com/mattlord/mongo-embedded-sample/blob/master/build-ins…
以上、参考になりましたら幸いです。
at_ohsawa
横からすみません。確認させてほしいのですが
libmongoc-1.0-0をインストールしてから、なぜ
再度そのソースコードを取得してビルドしようと
しているのでしょうか。
(たぶん、このページを参照されているとおもうのですが、
debianの場合はdriverのパッケージ名がlibmongocという
だけで、これをインストールすれば終わりです。
http://mongoc.org/libmongoc/current/installing.html)
libmongoc-1.0-0はビルド済みのmongo c driverそのものなので、
ソースコードを持ってきてビルドする必要は無いはずです。
ただし、debianの場合はライブラリのパッケージ(=libmongoc-1.0-0)と、
ヘッダファイルを含むパッケージは別々になっており、末尾に-devがついた
ものが、ヘッダファイルを含んでいます。
つまり、なにかmongo c driverをつかったコードをビルドするには
libmongoc-1.0-0に加えて次のパッケージをインストールするだけの
はずです。
sudo apt install libmongoc-dev
kentar_f
at_ohsawa様
ご指摘ありがとうございます。
> libmongoc-1.0-0をインストールしてから、なぜ
> 再度そのソースコードを取得してビルドしようと
> しているのでしょうか。
申し訳ありません、
ビルドまでの要/不要までは理解しておらず、サイトの手順通り進めた次第です。
> つまり、なにかmongo c driverをつかったコードをビルドするには
> libmongoc-1.0-0に加えて次のパッケージをインストールするだけの
> はずです。
なるほど、
libmongoc-1.0-0とlibmongoc-devをインストールするだけで
ドライバを使用できるはずということですね。
現状、リンクの仕方がまずいのか、そもそも考え方がまずいのかが
当方でも整理できていない状態です。
基本的な所でつまずいていますので、Linuxを扱う方にしたら
おかしなところも多々あるかとは思いますが、何卒ご了承ください。
koga
2022年3月27日 15時54分
アットマークテクノの古賀です。
kentar_fさん:
>ただMongo-c-driverがうまくリンクできず困っております。
>
>Mongo-c-driverは、Mongoのインストール手順で公開されているように
>下記の手順で行っています。
>sudo apt-get install libmongoc-1.0-0
>sudo apt-get install libbson-1.0-0
>sudo apt-get install cmake libssl-dev libsasl2-dev
>sudo wget https://github.com/mongodb/mongo-c-driver/releases/download/1.21.1/mong…
>sudo tar xzf mongo-c-driver-1.21.1.tar.gz
>cd mongo-c-driver-1.21.1
>mkdir cmake-build
>cd cmake-build
>cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF ..
>cmake --build .
>cmake --build . --target install
>
>こちらで作成したプログラムをmakeすると、
>などはパスするのですが、mongo-c-driverにある関数
>例えば mongo_client_new() を呼び出そうとすると
>'mongo_client_new' に対する定義されていない参照です。
>となり、前に進めず困っております。
念のため確認ですが、mongo_client_new() ではなく、
mongoc_client_new() ですよね?
http://mongoc.org/libmongoc/current/mongoc_client_new.html
<mongo.h> をインクルードしていらっしゃるということですが、mongo-c-driver の API 関数を呼び出すソースでは、<mongoc.h> をインクルードしろ、とチュートリアルに記載されています:
http://mongoc.org/libmongoc/1.12.0/tutorial.html#include-and-link-libmo…
実際、mongo-c-driver のソースを見ると、mongo_client_new() は mongoc-client.h で宣言されており、この mongoc-client.h を mongoc.h がインクルードしていますので、mongoc.h をインクルードすればよいはずです:
https://github.com/mongodb/mongo-c-driver/blob/28d66415d35bec28dba76c05…
https://github.com/mongodb/mongo-c-driver/blob/28d66415d35bec28dba76c05…