我试图在我的应用程序中使用 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 标志构建的,因此可以满足该部分的需求。有什么有用的提示吗?为什么它没有正确链接,为什么链接器没有给出任何错误?