由于链接错误

时间:2015-10-15 02:50:26

标签: c++ regex boost boost-regex

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

我已经安装了这样的提升。

$ 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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

g++ test.cpp -lboost_regex

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

当然我之前使用过这个命令:

sudo apt-get install libboost-all-dev
在ubuntu 15.04下测试