g++不能静态链接libmongcxx(r3.0.2),但可以动态链接

g++ cannot static link libmongcxx(r3.0.2) but dynamic link works

本文关键字:链接 但可以 动态 r3 不能 静态 libmongcxx g++      更新时间:2023-10-16

我使用mongodb站点的示例代码来显示这里的问题。操作系统:ArchLiux, c++是指向g++的链接

[dean@dell_xps_13 ~]$ c++——version c++ (GCC) 6.2.1 20160830版权所有(C) 2016自由软件基金会,Inc。这是自由软件;看到复制条件的源。没有保修;甚至没有适销性或适合于特定目的。

代码在测试中。cc文件

#include <iostream>
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
int main(int, char**) {
  mongocxx::instance inst{};
  mongocxx::client conn{mongocxx::uri{}};
  bsoncxx::builder::stream::document document{};
  auto collection = conn["testdb"]["testcollection"];
  document << "hello" << "world";
  collection.insert_one(document.view());
  auto cursor = collection.find({});
  for (auto&& doc : cursor) {
    std::cout << bsoncxx::to_json(doc) << std::endl;
  }
}

首先编译成目标文件:

c++ -g -std=c++11 -I…包括我/usr/include/bsoncxx/v_noabi-I/usr/include/mongocxx/v_noabiO -c ./test.cc

不带-static works链接:

c++测试。0 - 0 test -static-libgcc -static-libstdc++lboost_log -lboost_log_setup -lboostrongystem -lboost_thread -lboost_filesystem

这可以运行并打印出一些消息:

[dean@dell_xps_13 mongo-cxx-driver-r3.0.2]$ ./test
{
    "_id" : {
        "$oid" : "58218e821b489308ae4411d1"
    }, 
    "hello" : "world"
}

现在得到错误的-static选项

c++测试。-static-libgcc -static-libstdc++ -static-L/usr/lib -lpthread -lmongocxx -lbsoncxx -lboost_log -lboost_log_setup -lboostrongystem -lboost_thread -lboost_filesystem

下面显示了许多错误信息:

/usr/lib/libmongocxx.a(client.cpp.o): In functionmongocxx::v_noabi::client::client(mongocxx::v_noabi::uri const&, mongocxx::v_noabi::options::client const&)': /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x28): undefined reference to mongoc_client_new_from_uri"/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x10c):对mongoc_client_destroy' /usr/lib/libmongocxx.a(client.cpp.o): In function 的未定义引用mongocxx::v_noabi::client::operator=(mongocxx::v_noabi::client&&)':/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x190):未定义对mongoc_client_destroy' /usr/lib/libmongocxx.a(client.cpp.o): In function mongocxx的引用::v_noabi::client::~client()':/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x1c3):未定义的引用mongoc_client_destroy' /usr/lib/libmongocxx.a(client.cpp.o): In function mongocxx::v_noabi::client::read_concern(mongocxx::v_noabi::read_concern)':/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x214):对mongoc_client_set_read_concern' /usr/lib/libmongocxx.a(client.cpp.o): In function 的未定义引用mongocxx::v_noabi::client::read_concern() const':/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x243):对mongoc_client_get_read_concern' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x24b): undefined reference to的未定义引用mongoc_read_concern_copy/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x27c):对mongoc_read_concern_destroy' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x2a3): undefined reference to的未定义引用mongoc_read_concern_destroy/usr/lib/libmongocxx.a(client.cpp.o):在功能中mongocxx::v_noabi::client::read_preference(mongocxx::v_noabi::read_preference)': /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x3a4): undefined reference to mongoc_client_set_read_prefs"/usr/lib/libmongocxx.a(client.cpp.o):在功能中mongocxx::v_noabi::client::read_preference() const': /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x3c3): undefined reference to mongoc_client_get_read_prefs"/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x3cb):对mongoc_read_prefs_copy' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x3fc): undefined reference to的未定义引用mongoc_read_prefs_destroy/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x423):对mongoc_read_prefs_destroy' /usr/lib/libmongocxx.a(client.cpp.o): In function 的未定义引用mongocxx::v_noabi::client::uri() const':/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x463):对mongoc_client_get_uri' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x46b): undefined reference to的未定义引用/home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(。text + 0 x49c):对mongoc_uri_destroy' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x4c3): undefined reference to的未定义引用mongoc_uri_destroy/usr/lib/libmongocxx.a(client.cpp.o):在功能中mongocxx::v_noabi::client::write_concern(mongocxx::v_noabi::write_concern)': /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x504): undefined reference to mongoc_client_set_write_concern"/usr/lib/libmongocxx.a(client.cpp.o):在功能中"mongocxx:: v_noabi::客户::write_concern()常量的:

/usr/lib/libbsoncxx.a(oid.cpp.o): In functionbsoncxx::v_noabi::oid::to_string[abi:cxx11]() const': /home/dean/work/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(.text+0x139): undefined reference to bson_oid_to_string"/usr/lib/libbsoncxx.a(oid.cpp.o):在功能中bsoncxx::v_noabi::oid::get_time_t() const': /home/dean/work/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(.text+0x1ea): undefined reference to bson_oid_get_time_t"/usr/lib/libbsoncxx.a(oid.cpp.o):在功能中bsoncxx::v_noabi::oid_compare(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)': /home/dean/work/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(.text+0x24f): undefined reference to bson_oid_compare"/usr/lib/libbsoncxx.a(oid.cpp.o):在功能中bsoncxx::v_noabi::operator<(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)': /home/dean/work/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(.text+0x2af): undefined reference to bson_oid_compare"/usr/lib/libbsoncxx.a(oid.cpp.o):在功能中bsoncxx::v_noabi::operator>(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)': /home/dean/work/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(.text+0x30f): undefined reference to bson_oid_compare"/usr/lib/libbsoncxx.a(oid.cpp.o):在功能中bsoncxx::v_noabi::operator<=(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)': /home/dean/work/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(.text+0x36f): undefined reference to bson_oid_compare"/usr/lib/libbsoncxx.a(oid.cpp.o):在功能中bsoncxx::v_noabi::operator>=(bsoncxx::v_noabi::oid const&, bsoncxx::v_noabi::oid const&)': /home/dean/work/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(.text+0x3cf): undefined reference to bson_oid_compare"/usr/lib/libbsoncxx.a (oid.cpp.o):/home/院长/工作/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(。text + 0 x42f):下面是对' bson_oid_compare'的更多未定义引用:错误:ld返回1退出状态

-static标志强制链接器只接受静态库而不接受任何共享库。换句话说,它不需要在运行时依赖于动态库来运行。很可能mongocxx有一些依赖项。要实现静态链接,需要系统上存在库的存档(.a)版本。

另一个可能的问题是链接器命令行中静态库的顺序很重要,所以如果依赖于不同的静态库,这也可能是一个问题。链接器将按照命令行中的顺序处理库,并且从每个静态库中只提取所需的符号(与链接器当时拥有的信息一样多)

使用nm。它会给你符号名

相关文章: