dyld: Symbol not found: __ZNSt3__113basic_filebufIcNS_11char_traitsIcEEEC1Ev

问题描述

当我修改了几行代码,build了新的lib并集成到app以后,app 在mac11+ 的OS上运行良好,但是在 mac11 以及更多版本上,app持续crash,launch不起来。

使用terminal 打开app的时候,输出如下错误:

log 复制代码
dyld: Symbol not found: __ZNSt3__113basic_filebufIcNS_11char_traitsIcEEEC1Ev
  Referenced from: /Applications/**/**.node
  Expected in: /usr/lib/libc++.1.dylib

问题定位过程

  1. 遇到问题先google,google提供的建议基本都是升级macos,这个对我不适用。
  2. 排查可用版本与当前版本的变量,只有编译的macos和xcode升级了。基本可以确定是升级导致的。但仍然需要定位清楚为什么macos和xcode会导致在就的macos 上crash。
  3. 利用objdump工具查看lib的符号表,结果如下:
    同样的demo,在旧的sdk(MacOSX12.1.sdk) 和新的sdk(MacOSX13.1.sdk)下生成的符号表不同。
    源码:
C++ 复制代码
#include <iostream>
#include <fstream>

int main(int, char**){
  printf("hello");
  // std::cout << "Hello, from symbolTest!\n";
  
  std::ifstream fs("test.txt");
  std::filebuf fb;
  
  fb.open("test.txt", std::ios_base::in);
  std::cout << std::boolalpha
            << "direct call: " << fb.is_open() << '\n'
            << "through streambuf: " << fs.rdbuf()->is_open() << '\n'
            << "through fstream: " << fs.is_open() << '\n';
            
}

MacOSX13.1.sdk 编译出来的符号表

log 复制代码
objdump -t symbolTest | grep __ZNSt3__113basic_filebufIcNS_11
0000000000000000         *UND* __ZNSt3__113basic_filebufIcNS_11char_traitsIcEEE4openEPKcj
0000000000000000         *UND* __ZNSt3__113basic_filebufIcNS_11char_traitsIcEEEC1Ev
0000000000000000         *UND* __ZNSt3__113basic_filebufIcNS_11char_traitsIcEEED1Ev

MacOSX12.1.sdk 编译出来的符号表

log 复制代码
objdump -t symbleTest | grep ZNSt3113basic_filebufIcNS_11char_traitsIcEEEC1Ev
0000000100003280  w    F TEXT,text ZNSt3113basic_filebufIcNS_11char_traitsIcEEEC1Ev
0000000100003280      d  UND ZNSt3113basic_filebufIcNS_11char_traitsIcEEEC1Ev

不同的MacOSX sdk完全相同的编译选项,编出来的可执行文件里面的符号却不同。

  1. 问题定位到这里第一想法是把MacOSX 降级到原来的版本,但这是个大动作。从理论上讲,高版本的MacOSX 应该能兼容到MAC11。
  2. 查找其他在MacOSX13.1.sdk 编译出来的有符号的库,对比flags.make中的编译选项,发现编译选项少了一个-mmacosx-version-min=10.13 , 在cmake中加上这个编译选项后,再查找符号,符号就存在了。

解决方案

cmake中添加最小支持版本的编译选项

cmake 复制代码
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=11.0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=11.0")
相关推荐
凄凄迷人1 个月前
如何调试 chrome 崩溃日志(MAC)
前端·chrome·macos·crash
图王大胜1 个月前
Android Framework AMS(17)APP 异常Crash处理流程解读
android·app·异常处理·ams·crash·binderdied·讣告
Flamesky5 个月前
LogCat连接安卓手机拉取日志到本地(Unity开发版)
android·unity·logcat·crash·log
浮沉飘摇6 个月前
【CRASH】freelist异常导致的异常地址访问
linux·memory·crash·kernel
UWA8 个月前
PlayerSettings.WebGL.emscriptenArgs设置无效的问题
android·webgl·crash·unreal
UWA10 个月前
在TMP中计算书名号《》高度的问题
ui·lua·crash·audio
Morgana_Mo1 年前
iOS_Crash 四:的捕获和防护
ios·objective-c·xcode·crash·1024程序员节
Morgana_Mo1 年前
iOS_crash文件的获取及符号化(解析)
ios·debug·xcode·crash