登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 开发 vlog >> 主题: llvm-mingw-20250305-msvcrt-x86_64 -- 加 "-fno-exceptions" 参数可以去掉 "ld.lld: error: undefined symbol: __gnu_objc_personality_seh0" 异常     [回主站]     [分站链接]
标题
llvm-mingw-20250305-msvcrt-x86_64 -- 加 "-fno-exceptions" 参数可以去掉 "ld.lld: error: undefined symbol: __gnu_objc_personality_seh0" 异常
clq
浏览(5) + 2025-03-31 15:40:21 发表 编辑

关键字:

llvm-mingw-20250305-msvcrt-x86_64

加 "-fno-exceptions" 参数可以去掉 "ld.lld: error: undefined symbol: __gnu_objc_personality_seh0" 异常

环境是在 mm 文件中使用 std::string 老是报上面的错误。

问了 deepseek 好久才得这个可以用的方法。还有其他可能的方法没用。
--------------------------------------------------------

还是不行,为什么使用 std::string 会用到 seh ,能否强制指定不使用 seh
解决 std::string 在 LLVM-MinGW 下使用 SEH 的问题

你在 Windows 上使用 llvm-mingw 时遇到的 __gnu_objc_personality_seh0 错误是因为 LLVM 的 C++ 标准库实现默认使用了 SEH (Structured Exception Handling),而你的环境不支持这种异常处理方式。
根本原因分析

SEH 是什么:

Windows 的结构化异常处理机制

通常用于 C++ 异常和某些标准库实现

为什么 std::string 会用到 SEH:

LLVM 的 libc++ 在某些操作(如内存分配失败)中可能使用异常

MinGW 的某些实现需要 SEH 支持

解决方案
方案1:禁用 C++ 异常(推荐)

在编译时完全禁用 C++ 异常:
bash
复制

clang++ -fno-exceptions -D_HAS_EXCEPTIONS=0 -std=c++17 your_code.cpp -o output

这会:

禁用所有 C++ 异常

使标准库使用错误码而非异常

避免链接 SEH 相关符号

方案2:强制使用 SJLJ 异常模型
bash
复制

clang++ -fsjlj-exceptions -std=c++17 your_code.cpp -o output

SJLJ (Set Jump Long Jump) 是另一种异常处理方式,兼容性更好。
方案3:修改 std::string 实现

如果你需要完全控制,可以提供自定义的分配器:
cpp
复制

#include

template
struct NoExceptAllocator {
using value_type = T;

NoExceptAllocator() = default;
template NoExceptAllocator(const NoExceptAllocator&) {}

T* allocate(std::size_t n) {
if (n > std::size_t(-1) / sizeof(T))
std::abort();
if (auto p = static_cast(std::malloc(n * sizeof(T)))) {
return p;
}
std::abort();
}

void deallocate(T* p, std::size_t) noexcept {
std::free(p);
}
};

using SafeString = std::basic_string, NoExceptAllocator>;

方案4:使用替代字符串实现

考虑使用不依赖异常的小型字符串库,如:

folly::fbstring (来自 Facebook Folly)

llvm::StringRef

简单的 std::vector

验证方法

检查你的二进制文件是否还包含 SEH 相关符号:
bash
复制

objdump -t your_program.exe | grep personality

如果没有输出,说明 SEH 已被成功移除。
最佳实践建议

对于你的 NSString 实现项目,我建议:

使用 -fno-exceptions 编译

在头文件中添加:

cpp
复制

#ifdef __clang__
#pragma clang diagnostic ignored "-Wexceptions"
#endif

确保所有源文件使用相同的异常处理标志编译

这样应该能彻底解决 SEH 相关的链接错误问题。




总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1