Armadilloフォーラム

Mongo-c-driverのインストール

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-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 <bson.h>
#include <mongo.h>

>などはパスするのですが、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…

古賀様、
早速のご回答ありがとうございます。

> 念のため確認ですが、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/を
追加してインクルード部分でのエラーは無くなっています。

単に、その実体部分がリンクできていないということでしょうか?

基本的なところで、申し訳ありません。
よろしくお願いいたします。

アットマークテクノの古賀です。

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…

古賀様
早速のご回答頂きまして、ありがとうございます。

> リンクエラーする、ということであれば、これもチュートリアルに記載されているように、-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

アットマークテクノの古賀です。

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…

以上、参考になりましたら幸いです。

横からすみません。確認させてほしいのですが

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

at_ohsawa様
ご指摘ありがとうございます。

> libmongoc-1.0-0をインストールしてから、なぜ
> 再度そのソースコードを取得してビルドしようと
> しているのでしょうか。

申し訳ありません、
ビルドまでの要/不要までは理解しておらず、サイトの手順通り進めた次第です。

> つまり、なにかmongo c driverをつかったコードをビルドするには
> libmongoc-1.0-0に加えて次のパッケージをインストールするだけの
> はずです。

なるほど、
libmongoc-1.0-0とlibmongoc-devをインストールするだけで
ドライバを使用できるはずということですね。

現状、リンクの仕方がまずいのか、そもそも考え方がまずいのかが
当方でも整理できていない状態です。

基本的な所でつまずいていますので、Linuxを扱う方にしたら
おかしなところも多々あるかとは思いますが、何卒ご了承ください。