folly编译错误boost::re_detail_106100::cpp_regex_traits_implementation<char>::transform解决办法

解决Folly编译错误
本文记录了在使用Make编译Folly过程中遇到的关于Boost.Regex模块的未定义引用错误,并详细描述了解决步骤,包括确认Boost版本、定位问题原因及重新编译配置。

make编译folly时报错如下:

make[4]: Entering directory '/home/montafan/git/folly/folly/folly/experimental/logging/example'
/bin/bash ../../../libtool  --tag=CXX   --mode=link g++  -std=gnu++1y -g -O2 -lboost_context -lboost_program_options -lboost_thread -lboost_filesystem -lboost_system -lboost_regex -lpthread -lboost_chrono  -lssl -lcrypto  -o logging_example main.o libfollylogging_example.la -lbz2 -llzma -lz -lsnappy -llz4 -liberty -ldl -levent -ldouble-conversion -lglog -lgflags
libtool: link: g++ -std=gnu++1y -g -O2 -o .libs/logging_example main.o  ./.libs/libfollylogging_example.a /home/montafan/git/folly/folly/folly/experimental/logging/.libs/libfollylogging.so /home/montafan/git/folly/folly/folly/.libs/libfolly.so -lunwind -lboost_context -lboost_program_options -lboost_thread -lboost_filesystem -lboost_system -lboost_regex -lpthread -lboost_chrono -lssl -lcrypto -lbz2 -llzma -lz -lsnappy -llz4 -liberty -ldl -levent -ldouble-conversion -lglog -lgflags
/home/montafan/git/folly/folly/folly/.libs/libfolly.so: undefined reference to `boost::re_detail_106100::cpp_regex_traits_implementation<char>::transform(char const*, char const*) const'
/home/montafan/git/folly/folly/folly/.libs/libfolly.so: undefined reference to `boost::re_detail_106100::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::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)'
/home/montafan/git/folly/folly/folly/.libs/libfolly.so: undefined reference to `boost::re_detail_106100::perl_matcher<char const*, std::allocator<boost::sub_match<char const*> >, 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)'
/home/montafan/git/folly/folly/folly/.libs/libfolly.so: undefined reference to `boost::re_detail_106100::cpp_regex_traits_implementation<char>::transform_primary(char const*, char const*) const'
/home/montafan/git/folly/folly/folly/.libs/libfolly.so: undefined reference to `boost::re_detail_106100::raise_runtime_error(std::runtime_error const&)'
/home/montafan/git/folly/folly/folly/.libs/libfolly.so: undefined reference to `boost::re_detail_106100::get_mem_block()'
/home/montafan/git/folly/folly/folly/.libs/libfolly.so: undefined reference to `boost::re_detail_106100::get_default_error_string(boost::regex_constants::error_type)'
/home/montafan/git/folly/folly/folly/.libs/libfolly.so: undefined reference to `boost::re_detail_106100::put_mem_block(void*)'
/home/montafan/git/folly/folly/folly/.libs/libfolly.so: undefined reference to `boost::re_detail_106100::verify_options(unsigned int, boost::regex_constants::_match_flags)'

问题解决过程:

stackoverflow某个帖子说是多个版本的boost会导致该问题

但sudo ldconfig -v|grep boost发现版本是1.61,而且并没有重复安装其他版本的boost


再仔细看原来是Boost::Regex模块有问题,然后一搜果然发现问题,怎么有1.61和1.58两个版本

libboost_regex.so.1.58.0 -> libboost_regex.so.1.58.0

libboost_regex.so.1.61.0 -> libboost_regex.so.1.61.0

使用1.61.0,编译所有组建,成功

./bootstrap.sh --with-python=python3

sudo ./b2 --toolset=gcc --build-type=complete --layout=versioned --with-atomic --with-chrono --with-container --with-context --with-coroutine --with-coroutine2 --with-date_time --with-exception --with-filesystem --with-graph --with-graph_parallel --with-iostreams --with-locale --with-log --with-math --with-metaparse --with-mpi --with-program_options --with-python --with-random --with-regex --with-serialization --with-signals --with-system --with-test --with-thread --with-timer --with-type_erasure --with-wave  stage

安装

sudo ./b2 install --prefix=/usr/local


成功



<think>好的,我现在需要帮助用户寻找可以替代`ut::make_unique`的其他方法或函数。用户之前遇到了关于`ut::make_unique`报错的问题,现在想找到替代方案。首先,我得回顾之前的对话,看看之前给出的建议是什么,避免重复。 首先,用户提到的`ut::make_unique`可能属于第三方库UTPP,或者是用户自己实现的。之前的回答已经讨论了标准库的`std::make_unique`、自定义实现以及可能的命名空间问题。现在用户需要其他替代方法,所以需要扩展这些建议,或者提供不同的方法。 接下来,我需要考虑C++中创建`unique_ptr`的各种方法。替代`make_unique`的方法可能包括直接使用`new`操作符、自定义工厂函数、使用`std::unique_ptr`的构造函数,或者第三方库如Boost等。另外,还需要考虑不同C++标准下的兼容性问题,比如C++11中`make_unique`不可用,用户可能需要替代方案。 另外,用户提供的引用内容中提到了`parse_line`函数、静态链接与动态链接的区别,以及线程和进程的资源管理。虽然这些引用可能与当前问题没有直接关联,但可能需要考虑资源管理方面的问题,比如智能指针的使用如何与线程安全结合,但这可能不是当前的重点。 用户可能需要的是多种方法来创建`unique_ptr`对象,而不仅仅是依赖`ut::make_unique`或标准库的`make_unique`。需要列举几种不同的方法,并说明它们的优缺点,以及适用场景。 例如,直接使用`new`并将指针传递给`unique_ptr`的构造函数,这种方法在C++11中可用,但不如`make_unique`安全,因为可能存在异常安全问题。或者,使用`std::make_unique`的标准方法,但需要确保编译器支持C++14及以上。另外,可以提到使用工厂函数模板来封装创建过程,或者使用第三方库如Boost.SmartPtr中的`boost::make_unique`。 还需要考虑用户可能的环境限制,比如是否允许使用第三方库,或者是否需要兼容旧版C++标准。根据之前的回答,用户可能已经在C++14或更高版本中,但如果有需要兼容C++11的情况,可能需要提供自定义实现,或者替代方案。 另外,需要检查之前的回答是否已经涵盖了这些替代方法,避免重复。之前的回答提到过自定义实现`make_unique`,所以可能需要扩展其他方法,比如直接构造`unique_ptr`,或者使用其他智能指针如`shared_ptr`的工厂函数。 可能还需要提醒用户关于异常安全的问题,比如使用`new`直接构造时,如果构造函数抛出异常,可能导致内存泄漏,而`make_unique`可以避免这种情况。因此,在推荐替代方法时,需要权衡安全性和兼容性。 总结可能的替代方法: 1. 直接使用`std::unique_ptr`的构造函数,结合`new`。 2. 自定义`make_unique`函数(适用于C++11)。 3. 使用Boost库的`boost::make_unique`。 4. 使用`std::make_shared`如果适用(虽然返回的是`shared_ptr`,但可能在某些情况下可以转换)。 5. 使用其他第三方库提供的类似函数。 需要详细说明每种方法的用法、优缺点,以及适用场景,帮助用户根据具体情况选择最合适的替代方案。</think>以下是针对C++中替代`ut::make_unique`的多种方案及技术细节分析: --- ### 一、标准库替代方案 #### 1. `std::make_unique`(推荐) - **适用场景**:C++14及以上版本的标准项目 - **优势**:类型安全、异常安全、代码简洁 - **示例**: ```cpp #include <memory> auto ptr = std::make_unique<int>(42); // 直接构造对象 auto arr = std::make_unique<int[]>(5); // 动态数组(C++20) ``` - **验证编译器支持**: ```bash g++ -std=c++14 your_file.cpp ``` #### 2. `new`运算符显式构造 - **适用场景**:C++11环境或需要自定义删除器 - **风险**:非异常安全(若`new`后发生异常可能导致内存泄漏) - **示例**: ```cpp #include <memory> std::unique_ptr<int> ptr(new int(42)); // 直接初始化 std::unique_ptr<int[]> arr(new int[5]); // 动态数组 ``` --- ### 二、第三方库替代方案 #### 1. Boost库的`boost::make_unique` - **适用场景**:需兼容C++11且已集成Boost - **安装与使用**: ```cpp #include <boost/make_unique.hpp> auto ptr = boost::make_unique<std::vector<int>>(10, 1); // 初始化vector ``` - **特点**:提供类似C++14标准的行为,支持复杂构造参数[^2] #### 2. Folly库的`folly::make_unique` - **适用场景**:Facebook开源项目或高性能场景 - **示例**: ```cpp #include <folly/Memory.h> auto ptr = folly::make_unique<std::string>("hello"); ``` --- ### 三、自定义实现方案 #### 1. 基础模板实现(C++11兼容) - **代码示例**: ```cpp namespace my_utils { template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } } // 使用示例 auto ptr = my_utils::make_unique<std::complex<double>>(3.0, 4.0); ``` #### 2. 支持动态数组的扩展实现 - **增强兼容性**: ```cpp namespace my_utils { // 单对象版本 template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } // 数组特化版本 template<typename T> std::unique_ptr<T[]> make_unique(size_t size) { return std::unique_ptr<T[]>(new T[size]); } } ``` --- ### 四、设计模式替代方案 #### 1. 工厂函数封装 - **适用场景**:需要统一资源创建逻辑 - **示例**: ```cpp template<typename T> class ObjectFactory { public: template<typename... Args> static std::unique_ptr<T> create(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } }; // 使用示例 auto widget = ObjectFactory<Widget>::create(100, 200); ``` #### 2. 结合`std::forward_list`的延迟构造 - **特殊场景**:批量对象管理 ```cpp std::forward_list<std::unique_ptr<Sensor>> sensors; sensors.emplace_front(new TemperatureSensor()); sensors.emplace_front(new PressureSensor()); ``` --- ### 五、跨线程场景注意事项 当智能指针用于多线程时(参考[^3]中线程资源管理): 1. **所有权传递**:通过`std::move`转移`unique_ptr`到线程 ```cpp auto data = std::make_unique<DataPacket>(); std::thread worker([data = std::move(data)] { // 在新线程中独占使用data }); ``` 2. **避免竞态条件**:确保`unique_ptr`的移动操作在同步机制保护下 --- ### 验证代码模板 ```cpp #include <memory> #include <vector> class Demo { public: Demo(int a, double b) : x(a), y(b) {} private: int x; double y; }; int main() { // 标准库方式 auto d1 = std::make_unique<Demo>(10, 3.14); // 自定义实现 auto d2 = my_utils::make_unique<Demo>(20, 6.28); // 原生new方式 std::unique_ptr<Demo> d3(new Demo(30, 9.42)); return 0; } ``` --- ### 选择策略建议 | 方案 | 适用场景 | 安全性 | 可维护性 | |---------------------|----------------------------------|--------|----------| | `std::make_unique` | 新项目/C++14+ | ★★★★★ | ★★★★★ | | Boost实现 | 遗留项目/C++11 | ★★★★☆ | ★★★★☆ | | 自定义实现 | 无第三方库依赖 | ★★★☆☆ | ★★★☆☆ | | 显式`new` | 需要自定义删除器 | ★★☆☆☆ | ★★☆☆☆ | --- **--相关问题--** 1. 如何实现自定义删除器的`unique_ptr`? 2. `std::make_unique`与直接`new`构造在异常安全上有何区别? 3. C++20对智能指针增加了哪些新特性?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值