【问题标题】:g++ cannot static link libmongcxx(r3.0.2) but dynamic link worksg++ 不能静态链接 libmongcxx(r3.0.2) 但动态链接有效
【发布时间】:2017-03-22 00:04:35
【问题描述】:

我使用来自 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 tomongoc_client_new_from_uri' /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&&)' 的未定义引用: /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()' 的未定义引用: /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)'的未定义引用: /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' 的未定义引用: /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 tomongoc_read_concern_copy' 的引用 /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 tomongoc_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 tomongoc_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 tomongoc_client_get_read_prefs' /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 tomongoc_read_prefs_destroy 的引用 /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' 的未定义引用: /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 tomongoc_uri_copy' 的引用 /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 tomongoc_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 tomongoc_client_set_write_concern' /usr/lib/libmongocxx.a(client.cpp.o):在函数中 `mongocxx::v_noabi::client::write_concern() const':

....

/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 tobson_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 tobson_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 tobson_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 tobson_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 tobson_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 tobson_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 tobson_oid_compare' /usr/lib/libbsoncxx.a(oid.cpp.o):/home/dean/work/github/mongo-cxx-driver/src/bsoncxx/oid.cpp:(.text+0x42f): 更多未定义的对“bson_oid_compare”的引用跟随collect2: 错误:ld 返回 1 个退出状态

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 在我的系统中,我有 .a 和 .so 文件。 ls /usr/lib/libmongocxx.* -alh -rw-r--r-- 1 根 568K 2016 年 5 月 6 日 /usr/lib/libmongocxx.a lrwxrwxrwx 1 根 2016 年 5 月 6 日 21 /usr/lib/libmongocxx。所以-> libmongocxx.so._noabi -rwxr-xr-x 1 根 310K 2016 年 5 月 6 日 /usr/lib/libmongocxx.so.3.0.0 lrwxrwxrwx 1 根 2016 年 5 月 6 日 /usr/lib/libmongocxx.so。 _noabi -> libmongocxx.so.3.0.0
    • 是的,你有 libmongocxx.a 静态库,但你还需要有 (.a) 版本的依赖库
    • 你可能需要添加 -lbson 和 -lmongoc 来获取 libmongoc 和 libbson 依赖项。
    • libmongocxx 依赖于 mongo c 驱动,我忘了这个。使用nm可以看到有mongoc_client_new_from_uri函数,google一下,这是一个mongo c驱动函数。但是在我的系统中没有找到 libmongoc.a 文件。我正在寻找....
    • 这里是githublink。在安装之前尝试运行./configure --enable-static,这应该会触发静态库的生成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2011-04-11
    相关资源
    最近更新 更多