mac : dyld: Library not loaded 问题解决

本文详细介绍了在Mac中使用Xcode编写命令行程序时,遇到动态库路径问题的解决方法。通过修改依赖库路径为相对路径,解决了程序在其他Mac上运行时报错的问题。

在mac中用xcode编写了一个命令行程序,其中引入了一个framework,最终生成一个可执行程序。

在自己电脑上测试一切正常,可到其他mac中使用此程序,报如下错误:

dyld: Library not loaded: /use/lib/lib1

Referenced from: /use/bin/a

Reason: image not found

Trace/BPT trap

从如上错误中可以看出为运行时/use/bin/a为该命令行程序或者一个库,lib1为依赖的库文件,即最终动态链接时没有链接到lib1库文件,此时,即使将lib1库拷贝到程序所在目录中也不见效。

在xcode中找了好久,查看是否可以指定库路径为相对路径,没有找到。后来,一次偶然发现,可以直接改可执行程序依赖的库,以下为具体方法:

1.查看/use/bin/a的依赖文件,在命令行输入 otool -L /use/bin/a,假设结果如下:

 /use/lib/lib1 (compatibility version 0.0.0, current version 0.1.0) 

 /use/lib/lib2 (compatibility version 0.0.0, current version 0.1.0) 

............(省略其他依赖库)

从输出可以看出:在可执行文件中将依赖文件写死为/use/lib/lib1,导致我们将其移植到其他机器中时不太好操作,我们只能在所需移植的机器相同位置安放动态库文件,这样操作显然不太好。于是,我们可以将路径改为相对路径,移植到其他机器中,只需要将可执行文件和库放在同一个目录中,拷贝到其他机器中即可正常运行。

2.修改/use/bin/a的依赖文件路径:

install_name_tool -change /use/lib/lib1  @executable_path/lib1 /use/bin/a

 @executable_path为可执行程序的执行目录,网上介绍用@loader_path应该也可以

3.重复以上步骤,将依赖的库均改为相对路径,并拷贝到一个目录中组织起来(如果本身就是app,则可以在app包中进行组织)。

注意:一些库可能仍存在一些依赖关系,操作时需要递归地寻找每个库的依赖关系,并修改路径,具体做法同上。

4.网上说可以写个脚本加载xcode中,具体本人未测试,只是贴出来让大家看看吧: 在xcode中,展开targets节点,右键点工程名称,在菜单中选Add->New Build Phasa->New Run Script Build Phasa,在打开的对话框里面,把刚才的脚本贴进去。


### 解决Navicat 17 for Mac连接Oracle时提示“Oracle library is not loaded”的方法 在使用 **Navicat 17 for Mac** 连接 Oracle 数据库时,出现 **“Oracle library is not loaded”** 错误,通常是由于缺少 Oracle 的客户端库(OCI)或配置不正确所导致的。以下是详细的解决方法: #### 1. 安装Oracle Instant Client Navicat 依赖 Oracle 提供的 **Instant Client** 来连接 Oracle 数据库。在 Mac 系统中,需要手动下载并配置 Oracle Instant Client。 - 前往 Oracle 官网下载适用于 Mac 的 Instant Client: - [Oracle Instant Client Downloads](https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html) - 下载 **Basic Package**(例如 `instantclient-basic-macos.x64-*.zip`)。 - 解压下载的压缩包,将解压后的文件夹(如 `instantclient_21_10`)移动到 `/opt/oracle/` 目录下。 #### 2. 配置环境变量 Mac 系统需要设置环境变量以确保 Navicat 能正确找到 OCI 库。 - 打开终端,编辑环境变量配置文件(如 `.bash_profile` 或 `.zshrc`,取决于你的 shell 类型): ```bash nano ~/.bash_profile ``` - 添加以下内容(根据实际路径调整): ```bash export ORACLE_HOME=/opt/oracle/instantclient_21_10 export DYLD_LIBRARY_PATH=$ORACLE_HOME export PATH=$ORACLE_HOME:$PATH ``` - 保存并退出,然后运行: ```bash source ~/.bash_profile ``` #### 3. 配置Navicat的OCI环境 在 Navicat 中指定 Oracle 客户端库的路径: - 打开 Navicat 17 for Mac。 - 点击顶部菜单栏的 **“工具” > “选项” > “环境” > “OCI环境”**。 - 在 “OCI library” 字段中,输入 `libclntsh.dylib` 文件的完整路径,例如: ``` /opt/oracle/instantclient_21_10/libclntsh.dylib ``` - 点击确认并重启 Navicat。 #### 4. 检查Navicat与Oracle Instant Client的架构匹配 确保 Navicat 和 Oracle Instant Client 的架构一致,即如果使用的是 **64位 Navicat**,则必须安装 **64位 Oracle Instant Client**。若版本不匹配,也会导致“Oracle library is not loaded”错误[^4]。 #### 5. 验证连接 重新打开 Navicat,尝试建立新的 Oracle 连接并点击 **“测试连接”** 按钮,确认是否成功连接数据库。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值