2012-09-16 185 views
2

我想了解一些正则表达式的升压lib和我尝试编译这个简单的例子代码:链接错误

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

int main() 
{ 
    std::string s ("this subject has a submarine as a subsequence"); 
    boost::smatch m; 
    boost::regex e ("\\b(sub)([^ ]*)"); // matches words beginning by "sub" 

    std::cout << "Target sequence: " << s << std::endl; 
    std::cout << "Regular expression: /\\b(sub)([^ ]*)/" << std::endl; 
    std::cout << "The following matches and submatches were found:" << std::endl; 

    while (boost::regex_search (s,m,e)) { 
    for (auto x:m) std::cout << x << " "; 
    std::cout << std::endl; 
    s = m.suffix().str(); 
    } 

    return 0; 
} 

我用:g++ -std=c++0x -I /usr/lib/boost/include -L /usr/lib/boost/lib -lboost_regex test_regex.cpp

但G ++告诉我:

/tmp/ccjni2je.o: In function `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)': 
test_regex.cpp:(.text._ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j[boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)]+0x22): undefined reference to `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)' 
/tmp/ccjni2je.o: In function `bool boost::regex_search<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, boost::regex_traits<char, boost::cpp_regex_ 

和更多...

谁能帮助我?

+3

认沽'-lboost_regex'底。有关更多信息,请参阅http://stackoverflow.com/questions/9966959/noobish-linker-errors-when-compiling-against-glib/9966989#9966989。 – hmjd

回答

2

三件事:

  1. Boost.Regex库很有可能称为libboost_regex-mt
  2. 除非你知道Boost lib是用C++ 11支持编译的,否则你应该删除
    -std=c++0x选项。
  3. 因为GNU ld会按照目标文件和LIBS在命令行中出现的顺序解析符号,所以应始终将LIBS放在最后。

尝试:

 
g++ -I /usr/lib/boost/include -L /usr/lib/boost/lib test_regex.cpp -lboost_regex-mt 
+1

我知道C++ 11支持正则表达式,但我使用-std = C++ 0x,因为我在代码自动类型中使用。我试过你的版本,但g ++显示我: '/ usr/bin/ld:找不到-lboost_regex -mt collect2:ld返回1退出状态 '还有其他建议吗? – user1518451

+0

@ user1518451:在'/ usr/lib/boost/lib'中查找以'libboost_regex'开头并以'.a'结尾的文件。例如,在我的Boost副本中,它是'libboost_regex-mt.a'。 Boost.Build以库的名称编码其他编译选项,所以'-lboost_regex'可能是正确的,或者它可能是别的。 –

+0

我试过了:'g ++ -I/usr/lib/boost/include -L/usr/lib/boost/lib test_regex.cpp -lboost_regex',一切正常,但是当我启动程序时我看到:'./a.out :加载共享库时出错:libboost_regex.so.1.50.0:无法打开共享目标文件:没有这样的文件或目录 ' – user1518451