无法链接mongocxx静态库:链接时出现未定义引用错误求助
构建mongocxx静态可执行文件时出现未定义引用错误排查
已安装的相关库文件
执行以下命令查看系统中的库文件:
$ l /usr/local/lib/libmongoc* /usr/local/lib/libmongoc-1.0.so@ /usr/local/lib/libmongoc-1.0.so.0.0.0 /usr/local/lib/libmongocxx.so@ /usr/local/lib/libmongocxx.so._noabi@ /usr/local/lib/libmongoc-1.0.so.0@ /usr/local/lib/libmongoc-static-1.0.a /usr/local/lib/libmongocxx.so.3.8.0 /usr/local/lib/libmongocxx-static.a $ l /usr/local/lib/libbson* /usr/local/lib/libbson-1.0.so@ /usr/local/lib/libbson-1.0.so.0.0.0 /usr/local/lib/libbsoncxx.so.3.8.0 /usr/local/lib/libbsoncxx-static.a /usr/local/lib/libbson-1.0.so.0@ /usr/local/lib/libbsoncxx.so@ /usr/local/lib/libbsoncxx.so._noabi@ /usr/local/lib/libbson-static-1.0.a
出现的未定义引用错误
构建时抛出链接错误:
main.cpp:(.text.startup+0x5e): undefined reference to `mongocxx::v_noabi::instance::instance()' /usr/bin/ld: main.cpp:(.text.startup+0x6d): undefined reference to `bsoncxx::v_noabi::builder::core::core(bool)' /usr/bin/ld: main.cpp:(.text.startup+0x91): undefined reference to `bsoncxx::v_noabi::builder::core::key_view(core::v1::basic_string_view<char, std::char_traits<char> >)' /usr/bin/ld: main.cpp:(.text.startup+0xb5): undefined reference to `bsoncxx::v_noabi::builder::core::append(bsoncxx::v_noabi::types::b_string const&)' /usr/bin/ld: main.cpp:(.text.startup+0xc2): undefined reference to `bsoncxx::v_noabi::builder::core::extract_document()' /usr/bin/ld: main.cpp:(.text.startup+0xca): undefined reference to `bsoncxx::v_noabi::builder::core::~core()' /usr/bin/ld: main.cpp:(.text.startup+0xe8): undefined reference to `bsoncxx::v_noabi::builder::core::~core()' /usr/bin/ld: main.cpp:(.text.startup+0xf2): undefined reference to `mongocxx::v_noabi::instance::~instance()' /usr/bin/ld: main.cpp:(.text.startup+0x112): undefined reference to `mongocxx::v_noabi::instance::~instance()'
当前CMake配置
find_package配置
find_package(mongocxx REQUIRED) find_package(bsoncxx REQUIRED) find_package(mongoc-1.0 REQUIRED) find_package(mongoc-1.0 REQUIRED) find_package(bson-1.0 REQUIRED)
target_link_libraries配置
target_link_libraries(your_target INTERFACE mongo::mongocxx_static INTERFACE mongo::bsoncxx_static INTERFACE mongo::bson_static INTERFACE mongo::mongoc_static )
问题排查与解决方法
1. 修正链接关键字的使用错误
INTERFACE关键字用于库目标向依赖它的其他目标传递链接依赖,而你构建的是可执行文件,应该改用PRIVATE或PUBLIC:
target_link_libraries(your_target PRIVATE mongo::mongocxx_static mongo::bsoncxx_static mongo::mongoc_static mongo::bson_static )
2. 调整静态库的链接顺序
静态链接对库的顺序敏感,依赖库必须放在被依赖库的后方。mongocxx依赖bsoncxx,而两者又依赖底层的mongoc和bson库,同时还要手动链接mongoc依赖的系统库(如线程库、SSL库),建议调整为:
target_link_libraries(your_target PRIVATE mongo::mongocxx_static mongo::bsoncxx_static mongo::mongoc_static mongo::bson_static pthread ssl crypto )
3. 强制查找静态库
默认情况下find_package可能优先查找动态库,可在find_package前添加如下配置,强制CMake只查找静态库:
# 只查找.a后缀的静态库 set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") find_package(mongocxx REQUIRED CONFIG) find_package(bsoncxx REQUIRED CONFIG) find_package(mongoc-1.0 REQUIRED CONFIG) find_package(bson-1.0 REQUIRED CONFIG)
4. 添加静态库编译宏
使用mongocxx静态库时,必须定义MONGOCXX_STATIC和BSONCXX_STATIC宏,否则会链接到动态库的符号:
target_compile_definitions(your_target PRIVATE MONGOCXX_STATIC BSONCXX_STATIC)
5. 清理重复的find_package调用
你的配置中重复调用了find_package(mongoc-1.0 REQUIRED),可以删掉重复的一行,避免冗余。
内容的提问来源于stack exchange,提问作者user22343737
相关产品推荐
相关产品推荐

