【问题标题】:Issues using dependencies with g++在 g++ 中使用依赖项的问题
【发布时间】:2013-07-26 20:01:19
【问题描述】:

我在使用 g++ 链接到其他库时遇到了一些严重的问题,这常常让我感到沮丧,甚至在我开始之前就阻止了我。

例如:我只是在使用 boost.asio,尝试教程。我在文档中发现我必须链接到 boost_system 和正则表达式,但由于某种原因,我还必须添加 pthread 才能使其工作......我已经使用 'apt-get install' 安装了 boost,我认为我必须链接到被提升。显然错了...

看来我真的不明白怎么在linux上开发。如何知道何时需要添加库?在我给出的示例中,boost 依赖于 pthread,所以我必须链接它。为什么我不必链接到提升所依赖的任何其他东西?或者假设 pthread 依赖于某些东西,为什么我不必链接它(例如,你为什么不必链接到标准 C 库)?你怎么知道g++是怎么配置的?你怎么能改变它?

我想我的主要问题是:在 linux 上配置构建有什么逻辑吗? (也欢迎有用的参考资料)

最后一点令人沮丧:在我看来,编程总是比实际编程更有趣,也更容易......

【问题讨论】:

    标签: c++ boost g++ ld


    【解决方案1】:

    这是由于打包错误造成的。如果库 A 依赖于库 B,则该 A 应该链接到 B。您的应用程序只需链接到 A。

    有时,某些发行版的库的打包程序会出错。你对此无能为力,真的。例如,当我在 Gentoo Linux 上链接 boost_system 时,我不必链接到 pthread,因为 boost_system 链接到 pthread 本身:

    $ ldd /usr/lib/libboost_system.so | grep 线程 libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcf677f8000)

    【讨论】:

    • 我会接受,因为这是有用的信息。但是对我来说仍然有点模糊,为什么共享库会设置一些依赖项而不是其他依赖项,如果缺少依赖项,他们是如何首先构建它的?假设我决定从源代码构建一个库,它会生成共享库,它们会包含这个自动链接信息还是一些包装细节?
    • @user1896048 即使您不链接它们的依赖库,也可以构建共享库。这是因为只有在构建可执行文件时才会检查缺少的符号。在构建目标文件时,不会检查这一点(库是目标文件集合。)如果您从源代码构建,那么如果库的构建系统的创建者负责正确获取所有链接标志。如果没有,您仍然可以通过将-l 条目添加到LDFLAGS 来手动影响它(通常取决于使用的构建系统)。最后一步可能是 Debian 打包程序遗漏的。
    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 2018-01-22
    • 2020-07-21
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多