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

时间:2016-11-08 11:22:12

标签: c++ mongodb c++11 gcc mongo-cxx-driver

我使用mongodb网站的示例代码来显示问题。 OS:ArchLiux,c ++是g ++的链接

  

[dean @ dell_xps_13~] $ c ++ --version c ++(GCC)6.2.1 20160830版权所有   (C)2016 Free Software Foundation,Inc。这是免费软件;看到了   复制条件的来源。没有保修;甚至没有   适销性或适用于特定目的。

代码在test.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 ../ include -I / usr / include / bsoncxx / v_noabi   -I / usr / include / mongocxx / v_noabi -Wall -o test.o -c ./test.cc

链接它没有-static作品:

  

c ++ test.o -o test -static-libgcc -static-libstdc ++ -L / usr / lib   -lpthread -lmongocxx -lbsoncxx -lboost_log -lboost_log_setup -lboost_system -lboost_thread -lboost_filesystem

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

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

现在使用-static选项

获得错误
  

c ++ test.o -o test -static-libgcc -static-libstdc ++ -static   -L / usr / lib -lpthread -lmongocxx -lbsoncxx -lboost_log -lboost_log_setup -lboost_system -lboost_thread -lboost_filesystem

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

  

/usr/lib/libmongocxx.a(client.cpp.o):在函数中   mongocxx::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&#39;   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x10c):   未定义引用mongoc_client_destroy' /usr/lib/libmongocxx.a(client.cpp.o): In function mongocxx :: v_noabi :: client :: operator =(mongocxx :: v_noabi :: client&amp;&amp;)&#39;:   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x190):   未定义引用mongoc_client_destroy' /usr/lib/libmongocxx.a(client.cpp.o): In function mongocxx :: v_noabi :: client :: ~client()&#39;:   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x1c3):   未定义引用mongoc_client_destroy' /usr/lib/libmongocxx.a(client.cpp.o): In function mongocxx :: v_noabi :: client :: read_concern(mongocxx :: v_noabi :: read_concern)&#39;:   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x214):   未定义引用mongoc_client_set_read_concern' /usr/lib/libmongocxx.a(client.cpp.o): In function mongocxx :: v_noabi :: client :: read_concern()const&#39;:   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x243):   未明确引用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&#39;   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x27c):   未明确引用mongoc_read_concern_destroy' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x2a3): undefined reference to mongoc_read_concern_destroy&#39;   /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&#39;   /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&#39;   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x3cb):   未明确引用mongoc_read_prefs_copy' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x3fc): undefined reference to mongoc_read_prefs_destroy&#39;   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x423):   未定义引用mongoc_read_prefs_destroy' /usr/lib/libmongocxx.a(client.cpp.o): In function mongocxx :: v_noabi :: client :: uri()const&#39;:   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x463):   未明确引用mongoc_client_get_uri' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x46b): undefined reference to mongoc_uri_copy&#39;   /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x49c):   未明确引用mongoc_uri_destroy' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x4c3): undefined reference to mongoc_uri_destroy&#39;   /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&#39;   /usr/lib/libmongocxx.a(client.cpp.o):在功能上   `mongocxx :: v_noabi :: client :: write_concern()const&#39;:

...

  

/usr/lib/libbsoncxx.a(oid.cpp.o):在功能上   bsoncxx::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&#39;   /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&#39;   /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&#39;   /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&#39;   /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&#39;   /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&#39;   /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&#39;   /usr/lib/libbsoncxx.a(oid.cpp.o):/home/dean/work/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(.text+0x42f):   更多未定义的引用`bson_oid_compare&#39;关注collect2:   错误:ld返回1退出状态

1 个答案:

答案 0 :(得分:2)

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

另一个可能的问题是链接器命令行中的静态库的顺序很重要,因此如果存在对不同静态库的依赖性,这也可能是一个问题。链接器将按顺序处理库,因为它们位于命令行中,并且每个静态库只会提取所需的符号(具有链接器当时具有的信息)

使用nm。这将为您提供符号名称。