链接 Mongo C 驱动程序静态库时对符号错误的未定义引用

问题描述

我正在尝试使用 Mongo C driver 构建程序。我的 CMake 配置包括

include_directories("/usr/local/include/libmongoc-1.0")
include_directories("/usr/local/include/libbson-1.0")
...
SET (STATIC_LIBS
    ...
    libmongoc-static-1.0.a
    libbson-static-1.0.a
)

TARGET_LINK_LIBRARIES(myapp ${STATIC_LIBS})

编译阶段一切正常(所以似乎正确找到了包含),但是当链接阶段发生时,我收到此错误

/usr/bin/ld: /usr/local/lib/libmongoc-static-1.0.a(mongoc-counters.c.o): undefined reference to symbol 'shm_unlink@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/librt.so.1: error adding symbols: DSO missing from command line

它似乎正确地找到了静态库文件,但其中的某些内容不喜欢它...

有人发现过类似的错误吗?有什么已知的解决方案吗?

关于我的系统的一些附加信息:

  • gcc 版本:6.3.0
  • Mongo C 驱动版本:1.16.0
  • MongoDB 版本:4.4.1
  • 操作系统:Debian 9.3

谢谢!

编辑:对此进行调试,我发现如果我构建没有 SHM 计数器支持的 Mongo C 驱动程序:

cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF -DENABLE_SHM_COUNTERS=OFF -DENABLE_STATIC=ON ..

然后上面的错误就消失了。然而,这个新的和类似的事情发生了:

/usr/bin/ld: /usr/local/lib/libmongoc-static-1.0.a(mongoc-scram.c.o): undefined reference to symbol 'usprep_close_57'
//usr/lib/x86_64-linux-gnu/libicuuc.so.57: error adding symbols: DSO missing from command line

解决方法

我想我终于通过这种方式解决了这个问题(在查看 this piece of documentation 之后):

include_directories("/usr/local/include/libmongoc-1.0")
include_directories("/usr/local/include/libbson-1.0")
...

find_package (mongoc-1.0 1.17.4 EXACT)

SET (STATIC_LIBS
    ...
    mongo::mongoc_static
)

TARGET_LINK_LIBRARIES(myapp ${STATIC_LIBS})

我不需要使用 -DENABLE_SHM_COUNTERS=OFF -DENABLE_STATIC=ON 来构建驱动程序,并且文档中推荐的方法有效:

cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF ..