XCode中libNiTE2.dylib加载失败问题及终端运行正常不解咨询
解决Mac下NiTE2库
dyld: Library not loaded: libNiTE2.dylib问题 先给你拆解下为什么会出现这种“终端能跑、Xcode不行”的矛盾情况:
这本质是Xcode运行时的动态库搜索逻辑和终端环境不一样导致的。当你手动钻进
myapp.app/Contents/MacOS执行./myapp时,终端的当前工作目录就是这个文件夹,系统会优先在当前目录及相邻的Frameworks目录搜索依赖库;但Xcode默认启动app时,工作目录是你的项目根目录(或者Scheme里配置的其他路径),根本不在app包内部,自然找不到你拷贝到包里的libNiTE2.dylib。
你之前尝试的Copy Files操作方向是对的,但可能没配合路径配置,或者目标位置不对,下面给你几个针对性的解决方案:
方案1:调整Copy Files目标 + 配置环境变量
- 先检查Build Phases里的Copy Files设置:
- 把目标位置改成
Frameworks(确保libNiTE2.dylib被拷贝到myapp.app/Contents/Frameworks目录下)
- 把目标位置改成
- 配置Xcode运行时的环境变量:
- 点击Xcode顶部的Scheme下拉框,选
Edit Scheme... - 左侧选
Run,切换到Arguments标签 - 在
Environment Variables里新增一条:- 变量名:
DYLD_FRAMEWORK_PATH - 变量值:
@executable_path/../Frameworks
- 变量名:
- 勾选
Pass On Launch
这个相对路径会告诉系统:从app的可执行文件所在目录(MacOS)往上走一级,到Frameworks文件夹里找库。
- 点击Xcode顶部的Scheme下拉框,选
方案2:修改动态库的Install Name
动态库本身有个“Install Name”属性,决定了app加载时去哪里找它。你可以先查看当前的Install Name:
otool -D /你的libNiTE2.dylib路径/libNiTE2.dylib
如果输出是绝对路径或者错误的相对路径,就用install_name_tool修改:
install_name_tool -id @executable_path/../Frameworks/libNiTE2.dylib /你的libNiTE2.dylib路径/libNiTE2.dylib
修改完成后重新把库拷贝到app包里,这样app运行时会自动按照这个相对路径去找库,不需要依赖额外的环境变量。
方案3:让Xcode用app包内的工作目录启动
如果不想折腾库和环境变量,直接让Xcode启动时的工作目录和你手动运行时一致就行:
- 打开
Edit Scheme...->Run->Options标签 - 勾选
Working Directory,点击文件夹图标选择myapp.app/Contents/MacOS的路径(也可以用变量$(CONFIGURATION_BUILD_DIR)/$(EXECUTABLE_PATH)自动生成,避免硬编码路径)
这样设置后,Xcode启动app时的工作目录就和你终端手动运行时一样,系统自然能找到包里的动态库了。
内容的提问来源于stack exchange,提问作者yang
相关产品推荐
相关产品推荐

