boost::throw_exception错误:修改VS代码生成异常选项为/EHsc

VS2013中Boost库编译问题及解决:LNK2019错误,
文章讲述了在VisualStudio2013中尝试添加Boost库时遇到的LNK2019错误,涉及`throw_exception`符号未解析,解决方法是调整编译选项以正确链接Boost库。

VS2013添加boost头文件和库文件路径后,代码编译报错:
错误 LNK2019 无法解析的外部符号 “void __cdecl boost::throw_exception(class std::exception const &)” (?throw_exception@boost@@YAXAEBVexception@std@@@Z),该符号在函数 “public: __cdecl boost::gregorian:📅:date(class boost::gregorian::greg_year,class boost::gregorian::greg_month,class boost::gregorian::greg_day)” (??0date@gregorian@boost@@QEAA@Vgreg_year@12@Vgreg_month@12@Vgreg_day@12@@Z) 中被引用 asiotest

修改编译选项:
在这里插入图片描述

<think> 我们正在解决一个链接错误:对 `tbb::detail::r1::throw_exception(tbb::detail::d0::exception_id)` 的未定义引用。 这个错误通常发生在使用Intel TBB(Threading Building Blocks)库时,链接器无法找到对应的函数实现。 根据错误信息,问题出现在文件 _segment_table.h 的第535行,该行尝试调用 `throw_exception` 函数,但链接时找不到它的定义。 可能的原因和解决方案: 1. **未正确链接TBB库**:在编译时,我们需要确保链接了TBB库。通常,我们需要在链接命令中添加 `-ltbb` 标志。 例如:`g++ -o myprogram myprogram.cpp -ltbb` 2. **TBB库版本问题**:可能安装的TBB库版本与代码所需的版本不兼容。检查安装的TBB库版本,并尝试安装与代码兼容的版本。 3. **多版本TBB冲突**:如果系统中安装了多个版本的TBB(例如,系统自带的TBB和手动安装的TBB),可能会导致链接到错误的库。可以通过设置环境变量(如 `LD_LIBRARY_PATH`)来指定正确的库路径,或者在编译时使用 `-L` 指定库路径。 4. **TBB库未正确安装**:确认TBB库已经正确安装。可以尝试重新安装TBB。 5. **代码中使用了不同命名空间的TBB**:错误信息中提到了 `tbb::detail::r1` 和 `tbb::detail::d0`,这可能是TBB内部的不同命名空间。如果使用的TBB版本较新,可能内部实现有所变化。考虑检查TBB的版本,并查看对应版本的文档。 6. **使用CMake时的配置**:如果使用CMake,确保正确查找TBB库并使用它。可以使用 `find_package(TBB REQUIRED)` 并在目标链接中添加 `TBB::tbb`。 7. **检查头文件和库文件是否匹配**:可能头文件来自一个TBB版本,而链接的库是另一个版本。确保两者一致。 具体步骤: 步骤1:确保已安装TBB 在Ubuntu上,可以运行:`sudo apt-get install libtbb-dev` 或者从源代码安装(参考官方文档)。 步骤2:检查链接命令 在编译命令中,确保有 `-ltbb`。如果TBB库不在标准路径,使用 `-L` 指定路径,例如:`-L/path/to/tbb/lib -ltbb` 步骤3:设置运行时库路径(可选) 如果编译时指定了非标准路径,运行时可能需要设置 `LD_LIBRARY_PATH`:`export LD_LIBRARY_PATH=/path/to/tbb/lib:$LD_LIBRARY_PATH` 步骤4:如果使用CMake,示例CMakeLists.txt片段: ```cmake find_package(TBB REQUIRED) add_executable(my_target source.cpp) target_link_libraries(my_target PRIVATE TBB::tbb) ``` 步骤5:如果问题仍然存在,检查TBB版本。可以尝试更新或降级TBB。 步骤6:如果使用的是oneTBB(较新的TBB版本,命名空间可能有变化),可能需要检查代码是否兼容。错误中的路径 `/usr/local/include/oneapi/tbb/...` 表明使用的是oneTBB。oneTBB的安装可能包含多个组件,确保链接了正确的库(如`tbb`、`tbbmalloc`等)。 注意:oneTBB中的异常处理函数可能与旧版TBB不同。如果链接时仍然找不到,可能需要链接额外的库(如`tbbmalloc_proxy`)或者检查是否启用了异常处理。 步骤7:如果问题仍然无法解决,可以尝试在编译时定义宏以禁用特定的特性,但这可能不是最佳方案,最好还是确保正确链接。 由于具体环境和项目构建方式不同,可能需要根据实际情况调整。 相关问题: 1. 如何检查系统中已安装的TBB版本? 2. 如何在Linux下设置动态库路径? 3. 使用CMake如何查找和使用TBB库? 4. oneTBB和旧版TBB有什么区别? 5. 如何从源代码编译安装TBB? 如果上述步骤不能解决,请提供更多关于你的构建环境的信息(如编译器、操作系统、构建工具等)。 </think> ### 解决未定义引用 `tbb::detail::r1::throw_exception` 的方法 #### 问题诊断 该错误表明链接器找不到 Intel TBB (Threading Building Blocks) 库中 `throw_exception` 函数的实现。常见原因包括: 1. **库链接缺失**:编译时未正确链接 TBB 库文件 2. **ABI 不兼容**:头文件与库文件的版本不一致(如使用 oneTBB 新接口但链接旧版库)[^1] 3. **安装不完整**:TBB 库文件未正确安装或路径未配置 4. **符号可见性问题**:动态链接库导出符号异常 #### 解决方案 ##### 1. 确保正确链接 TBB 库 在编译命令中添加 TBB 链接参数: ```bash # 使用 g++ 示例 g++ your_code.cpp -o output -ltbb ``` - 若使用 CMake: ```cmake find_package(TBB REQUIRED) target_link_libraries(your_target PRIVATE TBB::tbb) ``` ##### 2. 验证 TBB 安装完整性 ```bash # 检查头文件路径 ls /usr/local/include/oneapi/tbb # 检查库文件是否存在 ldconfig -p | grep libtbb ``` - 若缺失库文件,重新安装 TBB: ```bash sudo apt-get install libtbb-dev # Ubuntu/Debian sudo yum install tbb-devel # CentOS/RHEL ``` ##### 3. 解决版本冲突 对于 oneTBB (v2021+),需显式链接 `tbb12` 库: ```bash # 指定新版符号版本 g++ your_code.cpp -o output -ltbb12 ``` 或强制兼容模式(不推荐): ```bash g++ -DTBB_USE_GLIBCXX_VERSION=... # 需匹配 GCC 版本 ``` ##### 4. 重建符号缓存 若存在损坏的符号表: ```bash sudo rm /etc/ld.so.cache sudo ldconfig ``` ##### 5. 源码编译安装(终极方案) ```bash wget https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2021.10.0.tar.gz tar -xzf v2021.10.0.tar.gz cd oneTBB-2021.10.0 mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. make -j$(nproc) sudo make install ``` #### 验证修复 ```bash # 检查符号是否存在 nm -D /usr/local/lib/libtbb.so | grep throw_exception # 应输出类似:T tbb::detail::r1::throw_exception ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码猿杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值