0

アプリケーションで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フラグを使用して構築されました。役立つヒントはありますか?正しくリンクされていないのはなぜですか?また、リンカーがエラーを出さないのはなぜですか?

4

0 に答える 0