0

我试图在我的应用程序中使用 Mongo C 驱动程序,但严重陷入链接问题。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 包含来自mongo C 驱动程序的未定义符号,这会产生运行时错误。

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 的可移植性警告,并生成最终的 srv.a 而不是 src.so(但这种情况是有道理的)。即使那样,srv.a 中也不存在这些符号。这对我来说更奇怪。

mongo C 驱动程序是使用 -fPIC 标志构建的,因此可以满足该部分的需求。有什么有用的提示吗?为什么它没有正确链接,为什么链接器没有给出任何错误?

4

0 回答 0