您的位置:
首页
>>
开发 vlog
>> 主题: llvm-mingw-20250305-msvcrt-x86_64 -- 加 "-fno-exceptions" 参数可以去掉 "ld.lld: error: undefined symbol: __gnu_objc_personality_seh0" 异常
[回主站]
[分站链接]
您的位置:
首页
>>
开发 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 相关的链接错误问题。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.