【问题标题】:Undefined reference error with boost::filesystem, despite using BOOST_NO_CXX11_SCOPED_ENUMS尽管使用了 BOOST_NO_CXX11_SCOPED_ENUMS,但 boost::filesystem 的未定义引用错误
【发布时间】:2017-01-08 08:51:02
【问题描述】:

我遇到了 Boost 文件系统库 (1.60.0) 的问题。在假设我做错了什么花了几个小时撕毁我的代码后,我尝试运行 Boost 自己的文件系统示例并遇到了同样的问题。在 OSX 上使用 gcc 编译时,所有这些都可以正常工作,但在 Ubuntu 14.04 上则不行。

我尝试在代码中定义 BOOST_NO_CXX11_SCOPED_ENUMS,并在运行 g++ 时尝试将其作为参数。我还尝试删除 -std=c++11 (我在一种情况下看到,这似乎对遇到此问题的人有所帮助)。无论如何,它在 Ubuntu 上总是失败。我正在使用的 Boost 示例是这样的:

// tut1
#include <iostream>

#define BOOST_NO_CXX11_SCOPED_ENUMS
#include <boost/filesystem.hpp>
using namespace boost::filesystem;

int main(int argc, char* argv[])
{
  if (argc < 2)
  {
    std::cout << "Usage: tut1 path\n";
    return 1;
  }
  std::cout << argv[1] << " " << file_size(argv[1]) << '\n';
  return 0;
}

尝试编译的结果如下:

vagrant@testing:~/boost_fs_test$ g++ -I/boost/1_60_0/include -L/boost/1_60_0/lib -lboost_system -lboost_filesystem test2.cpp -o test2
/tmp/cck0AVVX.o: In function `__static_initialization_and_destruction_0(int, int)':
test2.cpp:(.text+0x105): undefined reference to `boost::system::generic_category()'
test2.cpp:(.text+0x111): undefined reference to `boost::system::generic_category()'
test2.cpp:(.text+0x11d): undefined reference to `boost::system::system_category()'
/tmp/cck0AVVX.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)':
test2.cpp:(.text._ZN5boost10filesystem9file_sizeERKNS0_4pathE[_ZN5boost10filesystem9file_sizeERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status

vagrant@testing:~/boost_fs_test$ g++ -std=c++11 -I/boost/1_60_0/include -L/boost/1_60_0/lib -lboost_system -lboost_filesystem test2.cpp -o test2
/tmp/cceGCjpc.o: In function `__static_initialization_and_destruction_0(int, int)':
test2.cpp:(.text+0x105): undefined reference to `boost::system::generic_category()'
test2.cpp:(.text+0x111): undefined reference to `boost::system::generic_category()'
test2.cpp:(.text+0x11d): undefined reference to `boost::system::system_category()'
/tmp/cceGCjpc.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)':
test2.cpp:(.text._ZN5boost10filesystem9file_sizeERKNS0_4pathE[_ZN5boost10filesystem9file_sizeERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status

我仔细检查了我是如何安装 Boost 的,一切看起来都正确无误。这些库肯定在正确的位置:

-rw-rw-r-- 1 vagrant vagrant 237886 Jan  8 08:41 libboost_filesystem.a
lrwxrwxrwx 1 vagrant vagrant     29 Jan  8 08:40 libboost_filesystem.so -> libboost_filesystem.so.1.60.0
-rwxrwxr-x 1 vagrant vagrant 126186 Jan  8 08:40 libboost_filesystem.so.1.60.0
-rw-rw-r-- 1 vagrant vagrant  49226 Jan  8 08:41 libboost_system.a
lrwxrwxrwx 1 vagrant vagrant     25 Jan  8 08:40 libboost_system.so -> libboost_system.so.1.60.0
-rwxrwxr-x 1 vagrant vagrant  20469 Jan  8 08:40 libboost_system.so.1.60.0

同样的代码在 OSX 上编译得很好,但是:

jack-burton:boost_fs fny$ g++ -std=c++11 -I/usr/local/Cellar/boost/1.60.0_1/include -L/usr/local/Cellar/boost/1.60.0_1/lib -lboost_system -lboost_filesystem test2.cpp -o test2
jack-burton:boost_fs fny$ ls
test2       test2.cpp
jack-burton:boost_fs fny$ ./test2 test2.cpp
test2.cpp 321

我不确定我在这里缺少什么。出于好奇,我尝试使用 apt 安装 Boost(安装了 1.54)并遇到了同样的问题。

【问题讨论】:

    标签: c++ c++11 ubuntu boost


    【解决方案1】:

    好吧,我通过一些令人沮丧的试验和错误来解决这个问题。 :)

    在 CentOS 和 Ubuntu 上,我通过如下安装 Boost 使其工作:

    sudo ./b2 install link=static --with-system --with-filesystem

    然后,编译:

    g++ -std=c++11 -I/usr/local/include -L/usr/local/lib test.cpp -lboost_system -lboost_filesystem -o test

    关键似乎是 gcc 命令中库的位置。将它们放在源文件之后似乎可以解决问题。我正准备将 Boost 完全从项目中剔除,但幸运的是,这奏效了,让我不必重写相当多的代码。这可能是一个非常愚蠢的错误,但是直到...

    【讨论】:

      【解决方案2】:

      您似乎正在链接编译为共享库的 boost,请尝试使用 -DBOOST_ALL_DYN_LINK 编译或将 boost 显式编译为静态库 ./b2 link=static

      【讨论】:

      • 似乎两者都不走运。我先尝试了 BOOST_ALL_DYN_LINK。然后我尝试在再次运行 b2 时添加 link=static 。我看到它现在在 lib 文件夹中有 .a 文件,但它仍然无法编译测试代码,并出现与以前相同的错误。
      • 您确定包含路径正确吗?构建命令中的这些路径似乎表明您正在将 boost 安装到根目录并重新排列包含路径,这似乎不寻常。您是否尝试过以正常方式进行操作sudo ./b2 install?
      • 是的,我尝试的 /boost 路径绝对正确。我没有尝试在不指定安装位置的情况下安装它,所以我只是使用sudo ./b2 install 尝试了它,没有任何其他参数。在尝试编译测试程序时,无论是否明确传递 /usr/local 下的 include 和 lib 路径,都会出现同样的问题。 :( 合适的库肯定在 /usr/local/lib 下。
      • 出于好奇,我在不同的虚拟机上进行了尝试。我用 Vagrant 启动了一个 Ubuntu 16.04 机器,安装了 Boost 1.60,并遇到了同样的问题。我尝试使用 Boost 1.63 并且也遇到了同样的问题。编辑:它在 CentOS 7 VM 上编译,但可执行文件无法运行:加载共享库时出错:libboost_system.so.1.60.0:无法打开共享对象文件:没有这样的文件或目录。当我尝试强制它链接到 .a 文件时,它失败并出现与我在 Ubuntu 上遇到的相同错误。
      • 好的,所以我让它在 CentOS 上运行,但它仍然无法在 Ubuntu 上运行。我从 /usr/local/lib 中删除了所有的 boost 库,然后重新运行 b2:sudo ./b2 install link=static --with-system --with-filesystem。这仅安装了静态库,因此当我使用 g++ -std=c++11 -I/usr/local/include -L/usr/local/lib -lboost_system -lboost_filesystem test.cpp -o test 构建时它可以正确编译(并运行)。不过,这种方法不适用于 Ubuntu。啊。
      猜你喜欢
      • 2022-09-27
      • 2016-06-01
      • 2016-05-02
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多