使用boost::文件系统时无法链接

Cannot link when using boost::filesystem

本文关键字:链接 文件系统 boost 使用      更新时间:2023-10-16

我正在尝试使用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*)'

错误。

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

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

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

  • -L=/usr/local/lib

    在命令行中指定的目录将在默认目录之前进行搜索。所有-L选项应用于所有-L选项,而不考虑选项的显示顺序。如果searchdir以"="开头,则"="将被sysroot前缀取代,sysroot前缀是配置链接器时指定的路径。-L选项仅设置编译时库搜索路径;如果希望在运行时找到共享库,则必须在运行时知道其目录。

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

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

另一种选择是将提升库的位置添加到LD_LIBRARY_PATH中。

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

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

您可以在此处阅读有关链接器和共享库的更多信息。

要完全理解为什么您的安装在默认情况下找不到提升库,您可以在stackexchange上找到这个答案。

这个SO答案建议使用boost m4。