我正在为项目使用boost库,我遇到了regex库的问题。我正在重新安装库,因为我已升级到osx 10.9(mavericks)。
我得到2个未定义的引用:
boost::match_results<__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> > > > > >::maybe_assign(boost::match_results<__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> > > > > > const&)
和
boost::re_detail::perl_matcher<__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> > > > >, 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)
我从源代码安装boost库,特别是因为我不想使用macports或任何外部软件包安装程序。原因是我的程序用于数学和科学社区,我试图保持它,以便它可以很容易地从源编译具有适当的依赖(即链接到某些库,如gmp和mpfr,至少对于现在,提升)。
无论我使用何种编译器,都会发生未定义的引用问题。也就是说,我已经从命令行开发人员的工具中安装了带有apple默认编译器的gcc 4.7.3。因此,对于gcc4.7.3和默认的g ++(apple的clang,版本4.2.1)都会出现这种情况。
这是一个并行应用程序,所以我安装了两个版本的mpich3,它们都是用上面两个编译器编译的,并且安装并构建在不同的目录中。
当我构建boost时,我编辑了user-config.jam
文件并添加了行
using gcc : 4.7.3 : "abs\loc\here" ;
和
using mpi ;
然后我运行sudo ./bootstrap.sh ; sudo ./b2 ; sudo ./b2 install
(因为安装文件位于/ usr / local子目录中,所以需要sudo)
无论如何,使用boost库的文件名为para_aux_funcs.hpp / para_aux_funcs.cpp,我正在编译(好吧,在Makefile之后为我生成这个.c文件中的所有.o文件) ):
/usr/local/mpich3-mac-default/bin/mpic++ -cxx=/usr/local/bin/g++ -I/Users/matthewniemerg/Research/Bertini/Current/BertiniSource_v1.4/include -I/usr/local/boost_1_50_0/include -I../include -Dtimingstep2 -DTIXML_USE_STL -Wall -O3 -funroll-loops -fexpensive-optimizations -fopenmp -c para_aux_funcs.cpp -L/usr/local/boost_1_50_0/lib -lboost_regex -lboost_system -lboost_filesystem -o para_aux_funcs.o
我还使用其他mpi安装完成了此操作,并传递了相应的-cxx标志,以指示哪个编译器用于mpi编译。而且,我也在上面的命令中切换-L和-l标志的顺序,但结果相同。
也就是说,以下命令给出了上面指出的未定义引用:
/usr/local/mpich3-mac-default/bin/mpic++ -cxx=/usr/local/bin/g++ -I/Users/matthewniemerg/Research/Bertini/Current/BertiniSource_v1.4/include -I/usr/local/boost_1_50_0/include -I../include -Dtimingstep2 -DTIXML_USE_STL -Wall -O3 funroll-loops -fexpensive-optimizations -fopenmp -o paramotopy paramotopy.o point.o datagatherer.o failed_paths.o menu_cases.o master.o slave.o step2readandwrite.o runinfo.o mtrand.o random.o step2_funcs.o step1_funcs.o timing.o tinyxmlerror.o tinyxml.o tinystr.o tinyxmlparser.o xml_preferences.o para_aux_funcs.o ../lib/libbertini_osx9.a -lm -lmpfr -lgmp -L/usr/local/boost_1_50_0/lib -lboost_regex -lboost_system -lboost_filesystem
这看起来像链接错误,但我链接库(即-l标志)并指向库所在的相应目录(即-L标志)并指示适当的头文件所在的位置(即-I flag)。
任何想法/想法?