アプリケーションでMongoCドライバーを使用しようとしていますが、リンクの問題でひどく立ち往生しています。MongoCドライバーは、4つのオブジェクト(libbson.a + libbson.so + libmongoc.a + libmongoc.so)を提供します。私のMakefileには、このように追加されたライブラリがあります。
srv_la_LIBADD = -lrt -lcre2 -lre2 -lcurl -lpthread -lmongoc \
-lbson @MODULES_LIBADD@
ドライバはコンパイルされ、/ usr / local/libに正常にインストールされます。/libおよび/lib64ディレクトリにこれらへのリンクを作成しました。
問題は、私のアプリケーションが正しくコンパイルおよびリンクされているが、最終的なsrv.soに、実行時エラーを発生させるmongoCドライバーからの未定義のシンボルが含まれていることです。
Error loading module srv.so:/usr/local/c_icap/lib/c_icap/srv.so: undefined symbol: mongo_cursor_set_query
Makeプロセスのリンカーラインは次のとおりです。
libtool: link: gcc -shared -fPIC -DPIC .libs/srv_la-srv.o
.libs/srv_la-erd.o
.libs/srv_la-erd_list.o
.libs/srv_la-str_util.o
.libs/srv_la-url_util.o
.libs/srv_la-easyzlib.o
.libs/srv_la-state_db.o
.libs/srv_la-data_access_api.o
.libs/srv_la-cJSON.o
.libs/srv_la-clib_es.o
-lrt -lcre2 -lre2 /usr/lib/x86_64-linux-gnu/libcurl.so
-lpthread -lmongoc -lbson -O2 -O2 -Wl,-soname -Wl
,srv.so -o .libs/srv.so
具体的には、srv.soのobjdumpは次のように述べています。
root@talha:/webproxy# objdump -t services/.libs/srv.so|grep "mongo"
0000000000000000 *UND* 0000000000000000 mongo_cursor_set_query
0000000000000000 *UND* 0000000000000000 mongo_destroy
0000000000000000 *UND* 0000000000000000 mongo_cmd_authenticate
0000000000000000 *UND* 0000000000000000 mongo_create_index
0000000000000000 *UND* 0000000000000000 mongo_cursor_destroy
0000000000000000 *UND* 0000000000000000 mongo_update
0000000000000000 *UND* 0000000000000000 mongo_cursor_next
0000000000000000 *UND* 0000000000000000 mongo_cursor_init
0000000000000000 *UND* 0000000000000000 mongo_remove
0000000000000000 *UND* 0000000000000000 mongo_connect
0000000000000000 *UND* 0000000000000000 mongo_cursor_bson
一方、bsonシンボルは正しく追加されます。両方のライブラリが同じ場所にインストールされ、Makefileに追加されているため、これは奇妙なことです。
libmongoc.a(static)を静的にリンクしようとしましたが、その結果、リンカーはsrv.soがlibmongoc.aに対してリンクしているという移植性の警告を出し、src.soの代わりに最終的なsrv.aを生成します(ただし、この種の意味はあります)。それでも、シンボルはsrv.aに存在しません。それは私にとってさらに奇妙です。
mongo Cドライバーは、パーツがケータリングされるように-fPICフラグを使用して構築されました。役立つヒントはありますか?正しくリンクされていないのはなぜですか?また、リンカーがエラーを出さないのはなぜですか?