【问题标题】:I cannot build boost_regex code because of link erros由于链接错误,我无法构建 boost 正则表达式代码
【发布时间】:2016-01-13 08:22:13
【问题描述】:

我正在尝试在 ubuntu 12.04 (gcc 4.8.2) 上使用 boost_regex。

我已经像这样安装了 boost。

$ sudo apt-get install libboost-all-dev 

我已经确认安装了 boost_regex 库。

$ ls /usr/lib/x86_64-linux-gnu | grep regex
libboost_regex.a
libboost_regex.so
libboost_regex.so.1.54.0

然后,我尝试构建一个正则表达式程序代码。但是我遇到了链接错误。那我应该添加什么链接库?

 #include <boost/regex.hpp>
 #include <iostream>
 #include <string>

 int main()
 {
   std::string line;
   boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

   while (std::cin)
   {
     std::getline(std::cin, line);
     boost::smatch matches;
     if (boost::regex_match(line, matches, pat))
       std::cout << matches[2] << std::endl;
   }
 }


$ g++ -Wall -std=c++11 -o out test2.cc -lboost_regex  
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `icu_52::Locale::~Locale()'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `u_charType_52'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `icu_52::Locale::Locale(icu_52::Locale const&)'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `u_digit_52'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `icu_52::Collator::createInstance(icu_52::Locale const&, UErrorCode&)'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `icu_52::Locale::Locale()'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `u_charFromName_52'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `u_tolower_52'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `u_isspace_52'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libboost_regex.so: undefined reference to `u_isblank_52'
collect2: error: ld returned 1 exit status

【问题讨论】:

    标签: c++ regex boost boost-regex


    【解决方案1】:

    libboost-dev-all依赖(使用dpkg --status):

    libboost-dev
    libboost-tools-dev
    libboost-atomic-dev
    libboost-chrono-dev
    libboost-context-dev
    libboost-coroutine-dev
    libboost-date-time-dev
    libboost-exception-dev
    libboost-filesystem-dev
    libboost-graph-dev
    libboost-graph-parallel-dev
    libboost-iostreams-dev
    libboost-locale-dev
    libboost-log-dev
    libboost-math-dev
    libboost-mpi-dev
    libboost-mpi-python-dev
    libboost-program-options-dev
    libboost-python-dev
    libboost-random-dev
    libboost-regex-dev
    libboost-serialization-dev
    libboost-signals-dev
    libboost-system-dev
    libboost-test-dev
    libboost-thread-dev
    libboost-timer-dev
    libboost-wave-dev
    

    如您所见,例如libboost-regex-dev 不包含库:

    $ dpkg --listfiles libboost-regex-dev 
    /.
    /usr
    /usr/share
    /usr/share/doc
    /usr/share/doc/libboost-regex-dev
    /usr/share/doc/libboost-regex-dev/copyright
    /usr/share/doc/libboost-regex-dev/changelog.gz
    

    那是因为libboost-regex-dev 依赖于libboost-regex1.54-dev

    $ dpkg --listfiles libboost-regex1.54-dev 
    /.
    /usr
    /usr/share
    /usr/share/doc
    /usr/share/doc/libboost-regex1.54-dev
    /usr/share/doc/libboost-regex1.54-dev/copyright
    /usr/lib
    /usr/lib/x86_64-linux-gnu
    /usr/lib/x86_64-linux-gnu/libboost_regex.a
    /usr/share/doc/libboost-regex1.54-dev/changelog.Debian.gz
    /usr/lib/x86_64-linux-gnu/libboost_regex.so
    

    啊!但它需要ICU:

    $ ldd /usr/lib/x86_64-linux-gnu/libboost_regex.so
    linux-vdso.so.1 =>  (0x00007ffc265fb000)
    libicuuc.so.52 => /usr/lib/x86_64-linux-gnu/libicuuc.so.52 (0x00007feb20dc0000)
    libicui18n.so.52 => /usr/lib/x86_64-linux-gnu/libicui18n.so.52 (0x00007feb209b9000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007feb2063d000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007feb20426000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007feb20208000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feb1fe43000)
    libicudata.so.52 => /usr/lib/x86_64-linux-gnu/libicudata.so.52 (0x00007feb1e5d6000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007feb1e3d2000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007feb1e0cc000)
    /lib64/ld-linux-x86-64.so.2 (0x00007feb21440000)
    

    那么,是谁提供的?

    $ dpkg --search /usr/lib/x86_64-linux-gnu/libicuuc.so.52
    libicu52:amd64: /usr/lib/x86_64-linux-gnu/libicuuc.so.52
    

    有你的线索:

    解决方案

    $ sudo apt-get install libicu52
    

    【讨论】:

    • 你总是让我感到惊奇 :-) 我在我的 gentoo 盒子上遵循了类似的步骤来让我的提升感到高兴。就我而言,我在没有重建 boost 的情况下撞了我的盒子,而 boost 没有找到 libicu,因为当我移至 v58 时它正在寻找 v57。重建提升,修复。感谢您提供另一个有用的答案。
    • 两年后,我再次来到这里寻找解决方案。我会记住其中的一年。 :-)
    • @moodboom 我通常会遇到自己的答案。我只是认为 SO 是一个非常大的共享记事本 :)
    【解决方案2】:

    我已将您的代码放入 test.cpp

    我刚刚测试过像这样编译你的代码:

    g++ test.cpp -lboost_regex
    

    我现在没有任何错误,它正在工作

    当然我以前用过这个命令:

    sudo apt-get install libboost-all-dev
    

    在 ubuntu 15.04 下测试

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多