编译静态链接Boost_regex库生成独立二进制文件时遇链接错误求助
问题:编译静态链接Boost_regex 1.80生成独立二进制失败
我希望编译静态链接Boost_regex 1.80库,生成可在其他机器运行的独立二进制文件,但尝试后失败。我执行的编译步骤如下:
- 进入目录
{boost-path}/libs/regex/src/,生成目标文件:g++ -c *.cpp -I{boost-path}/boost/ - 生成静态库:
ar -r libboost_regex.a *.o - 将
libboost_regex.a移至自定义库目录,编译最终二进制文件:g++ -o out mycode.cpp -std=c++17 -L{libpath} -lboost_regex
最终g++报错如下:
/tmp/cc8LJ6pp.o: In function `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)': chker.cpp:(.text._ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j[_ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j]+0x2a): 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/cc8LJ6pp.o: In function `bool boost::regex_search<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(__gnu_cxx::__normal_iterator<char const*, std::string>, __gnu_cxx::__normal_iterator<char const*, std::string>, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, __gnu_cxx::__normal_iterator<char const*, std::string>)': chker.cpp:(.text._ZN5boost12regex_searchIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEbT_SD_RNS_13match_resultsISD_T0_EERKNS_11basic_regexIT1_T2_EENS_15regex_constants12_match_flagsESD_[_ZN5boost12regex_searchIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEbT_SD_RNS_13match_resultsISD_T0_EERKNS_11basic_regexIT1_T2_EENS_15regex_constants12_match_flagsESD_]+0xab): undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::find()' /tmp/cc8LJ6pp.o: In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::perl_matcher(__gnu_cxx::__normal_iterator<char const*, std::string>, __gnu_cxx::__normal_iterator<char const*, std::string>, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, __gnu_cxx::__normal_iterator<char const*, std::string>)': chker.cpp:(.text._ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEC2ES6_S6_RNS_13match_resultsIS6_S9_EERKNS_11basic_regexIcSD_EENS_15regex_constants12_match_flagsES6_[_ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEC5ES6_S6_RNS_13match_resultsIS6_S9_EERKNS_11basic_regexIcSD_EENS_15regex_constants12_match_flagsES6_]+0x113): undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)' collect2: error: ld returned 1 exit status
请问我在编译独立二进制文件时遗漏了什么步骤?
解决方法
你手动编译Boost.Regex静态库的方式存在几个关键问题,导致链接时出现未定义引用错误,以下是修正步骤:
1. 使用Boost官方构建工具编译静态库
Boost库推荐用b2(原bjam)工具编译,它会自动处理依赖、宏定义和编译选项,避免手动编译的遗漏:
- 首先进入Boost根目录,生成构建工具:
./bootstrap.sh --with-toolset=gcc - 编译静态链接的Boost.Regex库,指定静态链接、C++17标准,并生成独立于系统的二进制:
其中./b2 --build-type=minimal link=static runtime-link=static cxxflags="-std=c++17" --with-regex install --prefix={your-install-path}link=static表示编译静态库,runtime-link=static表示静态链接C++标准库,确保生成的二进制不依赖系统的动态库。
2. 若坚持手动编译,需添加必要宏定义和编译选项
手动编译时,Boost.Regex需要特定宏定义才能生成完整的静态符号,修正步骤如下:
- 生成目标文件时添加
-DBOOST_REGEX_STATIC_LINK宏,同时指定C++17标准:g++ -c *.cpp -I{boost-path}/boost/ -std=c++17 -DBOOST_REGEX_STATIC_LINK - 生成静态库时使用
ar rcs确保库的索引正确:ar rcs libboost_regex.a *.o
3. 链接时强制静态链接并处理依赖
编译最终二进制时,需要明确指定静态链接Boost.Regex,同时静态链接C++标准库,确保二进制独立:
g++ -o out mycode.cpp -std=c++17 -L{libpath} -static -lboost_regex -lpthread
-static选项强制链接所有静态库(包括Boost和C++标准库)-lpthread是Boost.Regex可能依赖的线程库,需手动添加
关键原因说明
你遇到的未定义引用错误,是因为手动编译时没有添加BOOST_REGEX_STATIC_LINK宏,导致Boost.Regex的部分符号被标记为动态链接专用,没有编译到静态库中;同时官方构建工具会自动处理的依赖(如线程库)也被遗漏,最终链接时找不到对应符号。
内容的提问来源于stack exchange,提问作者Conkel Conkel
相关产品推荐
相关产品推荐

