【问题标题】:undefined reference to `boost::program_options::options_description::m_default_line_length'对`boost::program_options::options_description::m_default_line_length'的未定义引用
【发布时间】:2012-08-24 03:14:53
【问题描述】:

我正在尝试编译代码,但出现错误

boost::program_options::options_description::m_default_line_length的未定义引用

我在 Ubuntu 12.04 中使用 g++。虽然我做过一些 C++ 编程,但我是 Linux 开发环境的新手(以前只使用过 IDE)。

所以我对这个问题进行了基本搜索,发现了一些链接问题。我不太了解他们,因为我是新手。阅读其中一些解决方案让我更加困惑。我的 boost 库文件夹位于/usr/include。一些解决方案说它应该在/usr/lib。但是我那里没有任何 boost 文件夹。

我需要改变什么?

【问题讨论】:

  • 打开一个终端并写updatedb && locate libboost_program_options。这将找到您为 boost 安装 lib 文件的路径。
  • OOps 抱歉现在才看到那个编辑。运行该命令并得到这个错误updatedb: can't open a temporary file for `/var/lib/mlocate/mlocate.db
  • 可能需要 sudo.. 您也可以使用 find 命令定位文件,但我发现 locate 命令更易于使用。 updatedb 命令只是更新locate 使用的数据库
  • 我已经安装了 MATLAB。现在该 locate 命令显示该文件位于 /usr/local/MATLAB/R2011a/bin/glnx86/libboost_program_options.so.1.40.0

标签: c++ boost g++ ubuntu-12.04


【解决方案1】:

如果您从 repo 安装了 boost,只需使用 -lboost_program_options 就足够了。
如果您在其他库中安装了 boost 库,则需要通过 -L/path/to/lib 指定该目录

在 CMake 中你可以指定set(CMAKE_CXX_FLAGS "-lboost_program_options")

但是你应该使用 CMake

FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(target ${Boost_LIBRARIES})

【讨论】:

  • 我已经从 repo 安装了,但是 -lboost_program_options 给了我一个错误 /usr/bin/ld: cannot find -lboost_program_options
  • 在CMake中你应该使用find_package(Boost ...来定位Boost并使用target_link_libraries来指定库;这有助于移植到其他编译器/操作系统。
  • 在我的系统中,-lboost_program_options 工作正常。 @user1633316:您可以搜索 libboost-* 文件。给出带有-L 的路径,注意您是否从 repo 安装了程序选项?
  • 对于带有 MacPorts 增强库的 OSX,使用 -lboost_program_options-mt
  • 仅在安装 libboost1.55-all-dev 后在 Ubuntu 14.04 上修复此问题
【解决方案2】:

C++11 标准中<string> 类的更改可能与使用非 C++11 编译器(例如 G++-4.8)编译的 Boost 库版本冲突。尝试重新编译 boost 或使用用于编译 Boost 库的 C++ 编译器版本。

【讨论】:

  • 这让我走上了正轨!我需要用g++-5 而不是g++-4.8 编译我的东西。 Ubuntu 16.04 将 g++-4.8 作为默认的 g++ 编译器可能不太好,而它提供的 C++ 库显然是通过 g++-5 编译的。
【解决方案3】:

还要仔细检查预处理器变量_GLIBCXX_USE_CXX11_ABI 的设置是否与用​​于编译boost 的变量设置相同。变量的默认设置可能会因 Linux 发行版和使用的 GNU 编译器版本而异。

更多信息请参见Dual ABI

【讨论】:

    【解决方案4】:

    boost 库(以 .so 和 .a 结尾的文件)在哪里?找到这些,然后将其添加到您的链接命令中:-L/path/to/boost/libs -lname-of-boost-lib

    这一定是人们第一次启动 c++ 时遇到的最常见的问题。 SO上可能还有一千个其他未定义的参考问题。只需搜索未定义的引用。

    【讨论】:

      【解决方案5】:

      这些库通常安装到/usr/lib(例如在我的系统上,/usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.58.0)。

      为了编译将链接到这些库的代码,您通常使用/usr/include 中提供的头文件。

      与许多库不同,Boost 不附带 pkg-config 文件,因此您需要自己添加链接器标志。使用通常的 Makefile 规则,您将需要 LDLIBS += -lboost_program_options 之类的内容。

      还要注意,虽然libboost-dev 包提供了program_options 的头文件,但您还需要安装libboost-program-options-dev 以获取相应的库。

      【讨论】:

        猜你喜欢
        • 2020-09-08
        • 1970-01-01
        • 2017-01-28
        • 2017-09-05
        • 1970-01-01
        • 2015-08-23
        • 1970-01-01
        • 2019-07-05
        • 1970-01-01
        相关资源
        最近更新 更多