编译时出现类名.o错误的时候的四种处理情况

本文介绍了在iOS开发中常见的几种导致编译错误的原因及排查方法,包括检查工程文件完整性、确保正确导入头文件、避免同名类重复导入以及确认.m文件已被包含。

1.查看工程里是否缺失相关文件!

2.是否在导入头文件的时候导入成了.m文件,,例:#import “*.m”;

3.工程导入两个同名类;

4.工程里的bid phases里缺少相关的.m文件;

我在ardupilot/library中新添加了两个文件,编译到最后出现报错usr/bin/ld: lib/libArduPlane_libs.a(AP_CANManager.cpp.0.o): in function `AP_CANManager::init()': AP_CANManager.cpp:(.text._ZN13AP_CANManager4initEv+0x556): undefined reference to `AP_ToshibaCAN::AP_ToshibaCAN()' collect2: error: ld returned 1 exit status Waf: Leaving directory `/home/hjhj3/ardupilot/build/sitl' Build failed -> task in 'bin/arduplane' failed (exit status 1): {task 127115774264480: cxxprogram AP_Arming.cpp.53.o,AP_ExternalControl_Plane.cpp.53.o,Attitude.cpp.53.o,GCS_MAVLink_Plane.cpp.53.o,GCS_Plane.cpp.53.o,Log.cpp.53.o,Parameters.cpp.53.o,Plane.cpp.53.o,RC_Channel_Plane.cpp.53.o,VTOL_Assist.cpp.53.o,afs_plane.cpp.53.o,altitude.cpp.53.o,avoidance_adsb.cpp.53.o,commands.cpp.53.o,commands_logic.cpp.53.o,control_modes.cpp.53.o,ekf_check.cpp.53.o,events.cpp.53.o,failsafe.cpp.53.o,fence.cpp.53.o,is_flying.cpp.53.o,mode.cpp.53.o,mode_LoiterAltQLand.cpp.53.o,mode_acro.cpp.53.o,mode_auto.cpp.53.o,mode_autoland.cpp.53.o,mode_autotune.cpp.53.o,mode_avoidADSB.cpp.53.o,mode_circle.cpp.53.o,mode_cruise.cpp.53.o,mode_fbwa.cpp.53.o,mode_fbwb.cpp.53.o,mode_guided.cpp.53.o,mode_loiter.cpp.53.o,mode_manual.cpp.53.o,mode_qacro.cpp.53.o,mode_qautotune.cpp.53.o,mode_qhover.cpp.53.o,mode_qland.cpp.53.o,mode_qloiter.cpp.53.o,mode_qrtl.cpp.53.o,mode_qstabilize.cpp.53.o,mode_rtl.cpp.53.o,mode_stabilize.cpp.53.o,mode_takeoff.cpp.53.o,mode_thermal.cpp.53.o,mode_training.cpp.53.o,motor_test.cpp.53.o,navigation.cpp.53.o,parachute.cpp.53.o,pullup.cpp.53.o,qautotune.cpp.53.o,quadplane.cpp.53.o,radio.cpp.53.o,reverse_thrust.cpp.53.o,sensors.cpp.53.o,servos.cpp.53.o,soaring.cpp.53.o,system.cpp.53.o,tailsitter.cpp.53.o,takeoff.cpp.53.o,tiltrotor.cpp.53.o,tuning.cpp.53.o -> arduplane} (run with -v to display more information)
最新发布
03-15
<think>嗯,用户遇到了在ArduPilot编译时出现的链接错误,具体是`undefined reference to AP_ToshibaCAN::AP_ToshibaCAN()`。这个问题看起来是链接器找不到`AP_ToshibaCAN`类的构造函数实现。我需要先理解这个错误的原因,然后逐步分析可能的解决方法。 首先,用户提到他们添加了两个新文件到ardupilot/library中。可能这两个文件和AP_ToshibaCAN类有关。错误信息指出在`AP_CANManager.cpp`的`init()`函数中,尝试调用`AP_ToshibaCAN`的构造函数时找不到定义。这意味着虽然头文件中声明了构造函数,但对应的源文件可能没有被正确编译或链接。 接下来,我需要考虑可能的原因: 1. **源文件未加入编译系统**:用户可能添加了头文件和源文件,但没有在waf脚本或Makefile中注册,导致编译器没有编译这些文件,进而链接时找不到符号。 2. **命名空间或作用域问题**:可能构造函数在头文件中的声明与源文件中的定义不一致,比如类名或命名空间错误。 3. **链接依赖顺序问题**:有时候链接器的库顺序可能导致某些符号无法正确解析,但这种情况比较少见,尤其是在ArduPilot的构建系统中。 4. **缺少依赖库**:如果`AP_ToshibaCAN`类依赖于其他库,这些库可能没有被正确链接。 然后,我应该建议用户逐步检查这些可能性。首先,确认新添加的源文件是否被编译。例如,检查`wscript`文件中的编译配置,确保新文件包含在对应的库或模块中。如果有遗漏,需要修改构建脚本,重新运行配置和编译。 其次,检查构造函数的实现是否正确。用户可能声明了构造函数但没有在源文件中定义,或者定义时类名拼写错误,比如大小写不一致或命名空间问题。例如,头文件中声明了`AP_ToshibaCAN::AP_ToshibaCAN()`,但源文件中的实现可能写成了其他形式,比如缺少命名空间或类名错误。 此外,建议用户清理构建目录后重新编译,有时候旧的编译产物可能导致问题。使用`./waf distclean`或删除build目录再重新编译。 如果问题依旧,可以检查`AP_ToshibaCAN`类是否依赖其他模块或库,这些依赖是否被正确配置。例如,是否需要启用特定的CAN驱动宏,或者在构建配置中启用相关选项。 最后,如果用户对ArduPilot的构建系统不熟悉,可能需要参考项目文档或社区资源,看看是否有类似的案例或构建配置示例。也可以建议用户在GitHub上搜索类似的问题,或者向ArduPilot的开发者社区提问,提供详细的错误信息和修改内容,以便获得更具体的帮助。</think>你的编译错误是由于链接器(ld)在构建过程中找不到 `AP_ToshibaCAN` 类的构造函数实现导致的。以下是分步排查和解决思路: --- ### **1. 检查新添加文件的编译参与情况** **关键问题**:新添加的 `.cpp` 文件是否被正确包含到编译系统中? - **ArduPilot 使用 Waf 构建系统**,需要确保新文件在 `wscript` 中注册: 1. 打开 `ardupilot/libraries/AP_CANManager/wscript`(或其他相关模块的 `wscript`)。 2. 检查是否将新文件(如 `AP_ToshibaCAN.cpp`)添加到 `src` 列表中: ```python # 示例片段 bld.SConscript( src = ['AP_CANManager.cpp', 'AP_ToshibaCAN.cpp'], # 确保新文件在此处 ... ) ``` 3. **重新配置并编译**: ```bash ./waf configure # 确保配置更新 ./waf plane # 重新编译 ``` --- ### **2. 验证构造函数实现** **关键问题**:`AP_ToshibaCAN` 类的构造函数是否正确定义? - **检查头文件声明**: 确保 `AP_ToshibaCAN.h` 中声明了构造函数: ```cpp class AP_ToshibaCAN { public: AP_ToshibaCAN(); // 构造函数声明 ... }; ``` - **检查源文件实现**: 确保 `AP_ToshibaCAN.cpp` 中实现了构造函数: ```cpp #include "AP_ToshibaCAN.h" AP_ToshibaCAN::AP_ToshibaCAN() { // 实现内容(即使暂时为空) } ``` --- ### **3. 检查命名空间或作用域** - 如果 `AP_ToshibaCAN` 类位于某个命名空间(如 `AP_HAL`),需确保声明和实现中的命名空间一致。 --- ### **4. 清理构建缓存** 旧的对象文件可能导致冲突: ```bash ./waf distclean # 彻底清理 ./waf configure ./waf plane # 重新编译 ``` --- ### **5. 依赖关系检查** 如果 `AP_ToshibaCAN` 依赖其他模块: - 确保依赖模块已启用(通过 `configure` 参数或宏定义)。 - 确保依赖模块的 `.cpp` 文件也被正确编译。 --- ### **6. 验证链接顺序** 如果问题仍存在,可能是链接顺序导致符号未解析。尝试: - 在 `wscript` 中调整库的链接顺序,将 `AP_ToshibaCAN` 所在库放在依赖它的模块之前。 --- ### **示例总结** 假设你新增了 `AP_ToshibaCAN.h` 和 `AP_ToshibaCAN.cpp`,典型修复步骤: 1. **将 `AP_ToshibaCAN.cpp` 添加到 `wscript` 的 `src` 列表**。 2. **确保构造函数在头文件和源文件中正确定义**。 3. **清理并重新编译**。 --- 如果问题仍未解决,建议: - 在 [ArduPilot GitHub Issues](https://github.com/ArduPilot/ardupilot/issues) 中搜索类似错误。 - 提供完整的代码修改和 `wscript` 片段,以便进一步排查。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值