iOS之Undefine symbols for architecture i386错误解决办法

本文介绍了解决因他人编译导致的编译错误的方法。需要在BuildSetting中删除target和project的FrameWorkSearchPath及LibrarySearchPath设置。


因为别人编过, 所以,你需要在BuildSetting里面,把target和project里面的 FrameWork Search Path 和 Library Search Path 的值都给删掉, 就 everything goes fine了。




注意:上面的 -F报错删 FrameWork Search Path, 如果是-L报错删Library Search Path




### 3.1 虚函数未定义导致的vtable错误 当类中包含虚函数但未提供实现时,编译器无法生成完整的虚函数表(vtable),从而在链接阶段报出`undefined reference to vtable for`错误。例如以下代码: ```cpp class Father { public: virtual void function() const = 0; }; class Child : public Father { public: Child(unsigned int data) : data(data) {} void function() const; // 未定义 private: int data; }; int main() { Child m_child(3); return 0; } ``` 尽管`Child::function()`在`main()`中未被调用,但由于它是从纯虚函数继承而来的虚函数重载,编译器仍会尝试为其生成虚函数表条目。若该函数没有具体实现,则链接器无法找到对应的函数指针,最终导致`undefined reference to vtable for Child`错误[^1]。 解决方法是为所有虚函数提供实现,即使它们在当前上下文中未被直接使用: ```cpp void Child::function() const { // 函数体可以为空 } ``` --- ### 3.2 类构造函数或析构函数未定义 如果一个类拥有虚函数,其构造函数或析构函数也可能涉及虚函数机制。若这些特殊成员函数未定义,同样会导致vtable缺失。例如: ```cpp class Basic { public: Basic() {} // 构造函数未定义完整 virtual void doSomething() = 0; }; ``` 此时若未提供完整的构造函数实现,链接器将报错:`undefined reference to vtable for Basic`[^2]。 正确的做法是确保所有虚函数类的构造函数和析构函数都有定义: ```cpp Basic::Basic() {} ``` 对于抽象类,析构函数应定义为虚函数并提供实现以避免资源泄漏问题: ```cpp virtual ~Basic() {} ``` --- ### 3.3 Qt项目中未启用MOC机制 在Qt项目中,若类声明了`Q_OBJECT`宏但未启用元对象编译器(MOC),也会导致vtable相关错误。例如: ```cpp class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr); }; ``` 若CMake未启用自动MOC处理功能,将无法生成所需的虚函数表信息。应在`CMakeLists.txt`中添加如下配置: ```cmake set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) ``` 这将确保Qt自动处理信号、槽及虚函数表生成过程,避免出现`undefined reference to vtable for`错误[^3]。 --- ### 3.4 源文件未正确加入构建目标 若类的源文件未被添加到可执行文件的构建目标中,即使函数已定义,链接器也无法找到对应符号。例如: ```cpp // child.cpp #include "child.h" void Child::function() const { // 实现内容 } ``` 而在`CMakeLists.txt`中仅包含主程序源文件: ```cmake add_executable(myapp main.cpp) ``` 由于`child.cpp`未被加入构建目标,链接器将报告`undefined reference to vtable for Child`错误。应修改CMake配置如下: ```cmake add_executable(myapp main.cpp child.cpp) ``` 这样可以确保所有类的实现代码都被正确编译并链接进最终程序中[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值