unresolved external symbol boost::throw_exception

本文介绍了解决使用Boost库时遇到的LNK2019错误的方法,通过正确地定义throw_exception函数来避免链接错误。

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

使用boost库,VS生成的时候一直报错,
error LNK2019: 无法解析的外部符号 “void __cdecl boost::throw_exception(class std::exception const &)”

搜索网上资料得知,可能是使用的boost库默认定义了BOOST_NO_EXCEPTIONS宏,需要用户自定义throw_exception函数,在报错的那个cpp中添加如下函数

void throw_exception(std::exception const & e) // user defined
{
    return;
}

结果还是一直报错,然后添加各种预定宏也解决不了。

后来查看<boost\throw_exception.hpp>发现,应该使用namespace boost

namespace boost
{
#ifdef BOOST_NO_EXCEPTIONS

void throw_exception( std::exception const & e ); // user defined

#else
  //省略若干
#endif
} // namespace boost

在报错的那个cpp中添加如下函数后解决

namespace boost
{
    void throw_exception(std::exception const & e) // user defined
    {
        return;
    }
}

最后,感谢http://blog.youkuaiyun.com/is2120/article/details/6385304

在处理链接错误 **L1:解析外部符号 `UPDATE_TIME`** 时,需要从多个角度分析可能的成因,并逐一排查。该错误通常出现在链接阶段,表明链接器无法找到 `UPDATE_TIME` 的定义,即使它在代码中被声明或引用。 ### 错误原因分析 未解析外部符号通常意味着符号在某个源文件或库中被引用,但在任何地方都没有实际定义。对于 `UPDATE_TIME`,这可能是一个全局变量、函数或者宏定义,但链接器无法找到其对应的实现或定义位置。以下是一些常见原因: - **符号仅声明未定义**:可能在头文件中通过 `extern` 声明了 `UPDATE_TIME`,但没有在任何 `.c` 或 `.cpp` 文件中实际定义它。 - **拼写或大小写不一致**:符号名称在声明和定义时存在拼写错误或大小写不一致。 - **编译单元未包含定义**:虽然定义了 `UPDATE_TIME`,但该定义所在的源文件未被编译或未参与链接。 - **静态库或动态库缺失**:如果 `UPDATE_TIME` 来自于某个库,但该库未正确链接到项目中,也会导致此错误。 - **作用域问题**:例如在 C++ 中将变量定义为 `static` 或 `const`,但未在类外正确初始化或定义。 ### 解决方法 #### 1. 检查符号定义 确保 `UPDATE_TIME` 在某处被正确定义。例如,如果在头文件中有如下声明: ```cpp extern int UPDATE_TIME; ``` 则应在某个 `.cpp` 文件中提供定义: ```cpp int UPDATE_TIME = 60; // 示例值 ``` #### 2. 检查拼写和大小写一致性 确保所有引用 `UPDATE_TIME` 的地方都保持完全一致的拼写和大小写。例如,`Update_Time` 和 `UPDATE_TIME` 是不同的符号。 #### 3. 确保包含定义的源文件参与编译 如果 `UPDATE_TIME` 的定义存在于某个 `.c` 或 `.cpp` 文件中,确认该文件已被加入项目,并且在构建过程中被正确编译和链接。 #### 4. 检查库文件链接 如果 `UPDATE_TIME` 来自第三方库或静态库,确认该库已正确添加到链接器输入中。在 Visual Studio 中,可以通过以下路径检查: - 右键项目 → 属性 → 链接器 → 输入 → 附加依赖项 添加类似 `mylib.lib` 的库文件名。 #### 5. 处理 const 和 static 成员变量 在 C++ 中,如果 `UPDATE_TIME` 是类的 `static const` 成员变量,必须在类外提供定义(除非是整型且在类内初始化): ```cpp // MyClass.h class MyClass { public: static const int UPDATE_TIME; }; // MyClass.cpp const int MyClass::UPDATE_TIME = 60; ``` ### 额外建议 - 使用调试工具(如 Visual Studio 的“转到定义”功能)可以帮助快速定位符号是否被正确识别。 - 启用编译器警告级别较高(如 `/W4` 在 MSVC 中)可以提前发现潜在的符号问题。 - 对于大型项目,可以使用 `nm`(Linux)或 `dumpbin`(Windows)工具检查目标文件或库中是否包含 `UPDATE_TIME` 的定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值