【问题标题】:Cannot link when using boost::filesystem使用 boost::filesystem 时无法链接
【发布时间】:2014-04-19 01:09:56
【问题描述】:

我正在尝试使用 boost::filesystem::exists 函数。当我尝试链接时,我得到了

/usr/local/include/boost/filesystem/operations.hpp:289: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'

错误。

我用谷歌搜索了一段时间,只找到了“link-with-boost”的答案。在我的情况下,为链接器指定了 -lboost_system 和 -lboost_filesystem,但它似乎不起作用。 实际上我可以使用 boost::filesytem::path (例如),但是当我尝试使用任何需要 boost/filesystem.hpp 标头的东西时,我会遇到链接器错误。 有什么想法吗?

附:我正在使用从 repos 安装的 gcc-4.6.4 和 boost lib,但我认为 gcc-4.6.4 是我的 ubuntu 12.04 的默认 gcc 版本。我想我不需要从源代码编译 boost?

【问题讨论】:

    标签: c++ linux boost boost-filesystem


    【解决方案1】:

    链接器 (ld) 有许多选项可以指定解析共享库的搜索路径,man ld 将为您提供所有选项。假设您在 /usr/local/lib 中安装了 boost,您可以将这些选项之一添加到 gcc 以传递给链接器:

    • -L=/usr/local/lib

      在默认目录之前搜索命令行中指定的目录。所有 -L 选项都适用于所有 -l 选项,无论选项出现的顺序如何。 如果 searchdir 以“=”开头,则“=”将替换为 sysroot 前缀,即配置链接器时指定的路径。 -L 选项只设置编译时库搜索路径;如果你想在运行时找到一个共享库,那么它的目录必须在运行时知道。

    • -Wl,-rpath,/usr/local/lib

      将目录添加到运行时库搜索路径。这在将 ELF 可执行文件与共享对象链接时使用。所有 -rpath 参数都被连接并传递给运行时链接器,运行时链接器使用它们在运行时定位共享对象。 -rpath 选项也用于定位明确包含在链接中的共享对象所需的共享对象;请参阅 -rpath-link 选项的说明。如果在链接 ELF 可执行文件时不使用 -rpath,则如果定义了环境变量“LD_RUN_PATH”,则将使用它的内容。

    另一种选择是将 boost 库的位置添加到您的 LD_LIBRARY_PATH

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
    

    链接器 (ld) 使用 LD_LIBRARY_PATH 作为查找所需共享库的搜索路径之一。

    您可以阅读有关链接器和共享库的更多信息here

    要完全理解为什么您的安装默认找不到 boost 库,您可能会发现 this answer at stackexchange 信息丰富。

    这个SO answer 建议使用boost m4

    【讨论】:

    • 谢谢你,amdn。你引导我解决问题。我的系统中有两组 boost 库文件:/usr/lib 和 /usr/local/lib。默认情况下使用 /usr/lib。所以对我有用的是指定 -L/usr/local/lib 链接器选项。请根据我的评论编辑您的答案,以便我接受。
    • @Farrel 很高兴我的回答很有帮助...不确定您希望我如何包含对您有用的解决方案...应该是另一种选择还是您建议我删除对 LD_LIBRARY_PATH 的引用?
    • 只需将此解决方案添加到您的答案中,我会将线程标记为已回答。 LD_LIBRARY_PATH 是解决问题的更真实的方法,我想。但是对于那些只需要快速修复 -L 选项的人来说(我只是尝试使用您的方法,但它对我不起作用:也许我以错误的方式安装了引导。我只是没有足够的时间来处理它。)。
    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多