php_lang_ref:Language Reference >> References Explained >> Unsetting References

本文通过案例演示了在PHP中如何使用引用,并解释了当使用unset函数解除引用时的具体行为。即使原始变量名被unset,指向同一内存地址的其他变量仍然有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
// +----------------------------------------------------------------------
// | Created by im-server.
// +----------------------------------------------------------------------
// | Language Reference >> References Explained >> Unsetting References
// +----------------------------------------------------------------------
// | Author: alexander <gt199899@gmail.com>
// +----------------------------------------------------------------------
// | Datetime: 2017-07-16 18:42
// +----------------------------------------------------------------------
// | Perfect Is Shit
// +----------------------------------------------------------------------

/**
 * 当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。
 * case1
 */

namespace case1;
$a = 1;
$b =& $a;
unset($a);
var_dump($b);
/**
 * 输出:
 * int(1)
 */
/usr/bin/ld: ../lib/libceres.a(solver.cc.o): in function `ceres::(anonymous namespace)::LineSearchOptionsAreValid(ceres::Solver::Options const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) [clone .cold]': solver.cc:(.text.unlikely+0xe26): undefined reference to `void absl::log_internal::LogMessage::CopyToEncodedBuffer<(absl::log_internal::LogMessage::StringType)0>(absl::string_view)' /usr/bin/ld: solver.cc:(.text.unlikely+0xe3a): undefined reference to `void absl::log_internal::LogMessage::CopyToEncodedBuffer<(absl::log_internal::LogMessage::StringType)0>(absl::string_view)' /usr/bin/ld: solver.cc:(.text.unlikely+0xe6f): undefined reference to `void absl::log_internal::LogMessage::CopyToEncodedBuffer<(absl::log_internal::LogMessage::StringType)0>(absl::string_view)' /usr/bin/ld: solver.cc:(.text.unlikely+0xe83): undefined reference to `void absl::log_internal::LogMessage::CopyToEncodedBuffer<(absl::log_internal::LogMessage::StringType)0>(absl::string_view)' /usr/bin/ld: solver.cc:(.text.unlikely+0xeb8): undefined reference to `void absl::log_internal::LogMessage::CopyToEncodedBuffer<(absl::log_internal::LogMessage::StringType)0>(absl::string_view)' /usr/bin/ld: ../lib/libceres.a(solver.cc.o):solver.cc:(.text.unlikely+0x1210): more undefined references to `void absl::log_internal::LogMessage::CopyToEncodedBuffer<(absl::log_internal::LogMessage::StringType)0>(absl::string_view)' follow /usr/bin/ld: ../lib/libceres.a(event_logger.cc.o): in function `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::basic_string_view<char, std::char_traits<char> > >(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)': event_logger.cc:(.text._ZN4absl19str_format_internal13FormatArgImpl8DispatchISt17basic_string_viewIcSt11char_traitsIcEEEEbNS1_4DataENS0_24FormatConversionSpecImplEPv[_ZN4absl19str_format_internal13FormatArgImpl8DispatchISt17basic_string_viewIcSt11char_traitsIcEEEEbNS1_
最新发布
03-12
<think>嗯,用户在使用Ceres Solver静态链接时遇到了未定义引用的错误,具体是absl::log_internal::LogMessage::CopyToEncodedBuffer找不到。我需要先了解这个错误的原因。 首先,Ceres Solver依赖一些外部库,比如Abseil、Eigen、glog等。静态链接时,需要确保所有依赖库也被正确链接。错误信息中的absl::log_internal说明问题出在Abseil库的日志模块没有被正确链接。 用户提到使用的是libceres.a,也就是静态库。这时候需要检查是否在编译命令中加入了所有必要的依赖库。可能用户只链接了libceres.a,但未链接Abseil的相关库,比如libabsl_log_internal_message.a或类似的库。 根据引用[1]中的错误,系统找不到absl的CMake配置文件,这可能意味着Abseil库没有正确安装或被检测到。但用户现在遇到的是链接时的错误,而不是配置阶段的错误,所以更可能是在链接阶段缺少Abseil的静态库。 解决方案可能包括:首先确保Abseil库已正确安装,并且其静态库文件存在。然后,在编译命令中显式添加所有需要的Abseil库。此外,检查编译命令的顺序,确保依赖库按正确的顺序排列,比如被依赖的库放在后面。 另外,可能需要查看Ceres的文档,确认其依赖库的版本是否兼容。如果Abseil版本过旧或过新,可能导致符号不匹配。此外,使用pkg-config或CMake来管理依赖,可以自动处理链接顺序和依赖关系,减少手动出错的概率。 总结步骤:1. 确认Abseil正确安装;2. 检查编译命令是否包含所有必要库;3. 调整链接顺序;4. 使用构建系统工具自动处理依赖。</think>针对Ceres Solver静态链接时出现的`undefined reference to absl::log_internal::LogMessage::CopyToEncodedBuffer`错误,以下是逐步解决方案: ### 问题原因 该错误表明**Abseil库的日志模块未正确链接**。Ceres Solver依赖Abseil库实现日志功能,静态编译时需要显式链接所有相关依赖[^1][^3]。 --- ### 解决方法 #### 步骤1:确保Abseil库已正确安装 1. 检查Abseil是否通过源码编译安装: ```bash git clone https://github.com/abseil/abseil-cpp.git cd abseil-cpp && mkdir build && cd build cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON .. make -j4 && sudo make install ``` #### 步骤2:调整编译命令链接顺序 在编译命令中**显式添加Abseil的日志库**,并确保链接顺序符合依赖关系: ```bash g++ your_program.cpp -o output \ -I/path/to/ceres/include \ -I/path/to/eigen3 \ /path/to/libceres.a \ /usr/local/lib/libabsl_log_internal_message.a \ /usr/local/lib/libabsl_strings.a \ -lglog -lpthread -lblas -llapack ``` 需根据实际路径调整`-I`和`-L`参数。 #### 步骤3:验证CMake配置 若使用CMake,需在`CMakeLists.txt`中明确声明Abseil依赖: ```cmake find_package(absl REQUIRED COMPONENTS log_internal_message strings) target_link_libraries(your_target ceres absl::log_internal_message absl::strings glog ) ``` --- ### 关键注意事项 1. **依赖库顺序**:被依赖的库(如Abseil)应放在依赖它们的库(如Ceres)之后 2. **符号冲突**:检查是否同时存在动态库(`.so`)和静态库(`.a`)混合链接 3. **版本兼容性**:确保Ceres、Abseil、glog等库版本匹配 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值