首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >g++不能静态链接libmongcxx(r3.0.2),但是动态链接工作

g++不能静态链接libmongcxx(r3.0.2),但是动态链接工作
EN

Stack Overflow用户
提问于 2016-11-08 11:22:12
回答 1查看 1.6K关注 0票数 3

我在这里使用mongodb站点的示例代码来说明问题。OS: ArchLiux,c++是到g++的链接

dean@dell_xps_13 ~$ c++ --版本c++ (GCC) 6.2.1 20160830版权(C) 2016FreeSoftwareFoundation,Inc.这是免费软件,请参阅复制条件的来源。没有任何保证,即使是适销性或适合某一特定用途。

代码在test.cc文件中

代码语言:javascript
复制
#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测试-静态-libgcc-静态-libstdc++ -L/usr/lib -lpthread -lmongocxx -lbsoncxx -lboost_log -lboost_log_setup -lboost_system -lboost_thread -lboost_filesystem

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

代码语言:javascript
复制
[dean@dell_xps_13 mongo-cxx-driver-r3.0.2]$ ./test
{
    "_id" : {
        "$oid" : "58218e821b489308ae4411d1"
    }, 
    "hello" : "world"
}

现在使用-static选项获取错误

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

许多错误消息显示如下:

/usr/lib/libmongocx.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的未定义引用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()‘的未定义引用:对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‘的未定义引用:对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_的未定义引用销毁‘/usr/lib/libmongocx.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/libmongocx.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中未定义的对mongoc_read_prefs_copy' /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x3fc): undefined reference tomongoc_read_prefs_destroy‘/home/mongocxx::v_noabi::client::read_preference() const': /home/dean/work/github/mongo-cxx-driver/src/mongocxx/client.cpp:(.text+0x3c3): undefined reference to/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/libmongocx.a(client.cpp.o)的引用:在函数`mongocxx::v_noabi::client::write_concern() const’中:

……

/usr/lib/libbsoncx.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/libbsoncx.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/libbsoncx.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/libbsoncx.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/libbsoncx.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/libbsoncx.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/libbsoncx.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’‘中src/bsoncxx/oid.cpp:(.text+0x42f):对`bson_oid_compare‘的更多未定义引用遵循collect2:错误: ld返回1个退出状态

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-08 11:48:12

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

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

使用nm。会给你一个符号名。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40485621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档