duplicate symbols for architecture i386/x86_64解决办法

本文总结了解决Objective-C与Swift在iOS开发中出现的冲突.o文件问题的方法,包括使用低版本第三方库、升级Xcode7、去掉特定链接设置等策略。同时,也提到了检查导入文件是否正确、避免重复导入类或库的重要性。

这几天遇到这个问题,找了好多,总结下解决办法

1:两个冲突的.o文件在同一个三方库中(我遇到的问题。。。)如图

解决办法:使用低版本的第三方库或者升级xcode7,因为 SDK 使用 Xcode 7 ,并支持 bitcode导致的。。。非常蛋疼。。。。


2:两个冲突的.o文件在两个第三方库中,解决办法是去掉araget->Build Settings->Other Linker Flags->all -load


其他的:

有可能是导入了.m文件(本来该导入.h的)

检查Taraget->Build Settings->Link Binary With Libraries检查是否有重复lib,或者是全局检查有没有重复的类

或者是哪个类被导入了两次。。。

暂时想到这么多,到时候再添加吧

<think> 我们面对的问题是:无法访问http://127.0.0.1:1220,报错为“Perl execution failed,Can't locate tag_vals.pl in @INC”,但我们已经通过find命令找到了tag_vals.pl文件的多个路径。 这个错误表明Perl在执行过程中无法找到tag_vals.pl文件。在Perl中,模块或库文件的搜索路径由@INC数组定义。当使用`require`或`use`加载文件时,Perl会在@INC中的路径里查找。 解决思路: 1. 确认报错中tag_vals.pl文件的确切路径,并确保该文件存在且可读。 2. 将tag_vals.pl所在的目录添加到Perl的模块搜索路径(@INC)中。 根据用户描述,已经通过find找到了多个tag_vals.pl文件,那么我们需要确定使用哪一个,并确保将其所在目录加入@INC。 具体步骤: 步骤1:确定使用哪个tag_vals.pl文件 通常,我们应该选择与Darwin Streaming Server(DSS)相关的路径。例如,如果DSS安装在/usr/local/streaming,那么相关的Perl脚本可能位于该目录下。假设我们找到的其中一个路径是: /usr/local/streaming/AdminHtml/tag_vals.pl 步骤2:将tag_vals.pl所在的目录添加到Perl的@INC中 有两种方式: a. 在调用Perl脚本时使用-I选项指定目录,例如: perl -I /usr/local/streaming/AdminHtml your_script.pl b. 在Perl脚本的开头使用lib模块添加路径,例如: use lib '/usr/local/streaming/AdminHtml'; 但是,由于我们是访问DSS的管理页面,所以我们需要修改的是DSS的管理服务器脚本。DSS的管理服务器脚本通常是`streamingadminserver.pl`,位于`/usr/local/sbin/`。 步骤3:修改streamingadminserver.pl 在streamingadminserver.pl文件的开头添加Perl模块搜索路径。 例如,在文件开头(在#!/usr/bin/perl之后)添加: use lib '/usr/local/streaming/AdminHtml'; # 替换为实际的tag_vals.pl所在目录 如果找到多个tag_vals.pl文件,建议选择与AdminHtml相关的那个目录。 步骤4:检查文件权限 确保tag_vals.pl文件对于运行streamingadminserver.pl的用户(可能是root或者streaming用户)是可读的。 步骤5:重启DSS管理服务 修改后,重启服务: sudo /usr/local/sbin/streamingadminserver.pl restart 或者,如果之前没有运行,则直接启动。 如果问题仍然存在,我们可以尝试在报错的脚本中直接添加路径。但报错发生在AdminHtml目录下的某个脚本,所以我们需要确定是哪个脚本在调用tag_vals.pl。通常,这个文件可能是AdminHtml目录下的某个cgi脚本。 步骤6:如果上述方法无效,可以尝试在Perl的@INC中添加多个目录 如果tag_vals.pl被多个地方使用,或者有多个版本,可能需要添加多个路径。但一般只需要添加管理页面所在的路径。 另一种方法:创建符号链接 将tag_vals.pl所在的目录链接到Perl默认的模块路径之一,比如/usr/local/lib/perl5(具体取决于系统),但这种方法可能不太规范。 由于我们不知道具体的报错脚本,我们可以全局搜索一下调用tag_vals.pl的地方,看看是哪个脚本需要它。然后在该脚本的开头添加lib路径。 但是,根据经验,DSS的管理界面相关脚本位于AdminHtml目录下,所以我们可以尝试修改AdminHtml目录下的脚本,在开头添加路径。 然而,更简单的方法是通过设置环境变量PERL5LIB来增加模块搜索路径。例如,在启动streamingadminserver.pl之前: export PERL5LIB=/usr/local/streaming/AdminHtml:$PERL5LIB /usr/local/sbin/streamingadminserver.pl 我们可以将这一环境变量设置添加到启动脚本中。 具体操作: 1. 打开启动脚本(如果使用系统服务,则修改服务脚本)或创建自定义启动脚本。 2. 在启动之前设置环境变量。 例如,创建一个启动脚本start_dss_admin.sh: #!/bin/bash export PERL5LIB=/usr/local/streaming/AdminHtml /usr/local/sbin/streamingadminserver.pl 然后运行这个脚本。 考虑到用户可能已经通过find找到了多个路径,我们需要选择正确的路径。例如: /usr/local/streaming/AdminHtml/tag_vals.pl /usr/local/streaming/Perl/tag_vals.pl 通常,AdminHtml目录下的cgi脚本会使用AdminHtml目录下的tag_vals.pl,因此选择AdminHtml目录。 总结步骤: 方法一(推荐): 1. 找到streamingadminserver.pl的启动方式(通常为/usr/local/sbin/streamingadminserver.pl) 2. 修改该文件,在开头(#!/usr/bin/perl下面)添加: use lib '/usr/local/streaming/AdminHtml'; # 注意替换为实际路径 3. 重启服务。 方法二: 1. 设置环境变量PERL5LIB,包含tag_vals.pl所在目录,例如: export PERL5LIB=/usr/local/streaming/AdminHtml 2. 然后启动streamingadminserver.pl。 如果使用系统服务,可以在systemd服务文件中设置环境变量。 注意:如果找不到streamingadminserver.pl的启动脚本,可能它是以系统服务方式运行的,那么我们需要修改服务文件(如/etc/init.d/streaming或systemd服务)。 在systemd服务中设置环境变量: [Service] Environment="PERL5LIB=/usr/local/streaming/AdminHtml" 然后重启服务。 由于我们不知道用户的具体环境,可能需要用户根据实际情况调整路径。 另外,如果用户系统中存在多个tag_vals.pl,可能是重复安装导致的,建议保留一个(比如AdminHtml下的),其他的可以删除或备份。 最后,确保文件权限正确: sudo chmod 644 /usr/local/streaming/AdminHtml/tag_vals.pl sudo chown root:root /usr/local/streaming/AdminHtml/tag_vals.pl # 根据实际用户调整 如果仍然不行,可以尝试在调用tag_vals.pl的脚本中指定绝对路径,例如将 require 'tag_vals.pl'; 改为: require '/usr/local/streaming/AdminHtml/tag_vals.pl'; 但是需要找到所有引用tag_vals.pl的地方,这可以通过grep: grep -r "require 'tag_vals.pl'" /usr/local/streaming/AdminHtml 然后逐个修改。 然而,修改多个文件可能会带来维护问题,所以优先考虑添加@INC路径。 请用户根据实际情况选择合适的方法。 </think>### 解决 Darwin Streaming Server 无法访问 http://127.0.0.1:1220 的 Perl 路径问题 #### 问题分析 当访问 `http://127.0.0.1:1220` 时出现 `Can't locate tag_vals.pl in @INC` 错误,表明 Perl 无法在默认搜索路径中找到 `tag_vals.pl` 文件。这通常是由于环境变量配置错误或路径未正确加载导致的[^1]。 --- ### 解决方案 #### 步骤 1:确认正确的文件路径 通过 `find` 命令找到的多个路径中,选择与 Darwin Streaming Server 安装目录最相关的路径(通常是包含其他 Perl 脚本的目录): ```bash # 示例路径 /usr/local/streaming/AdminHtml/tag_vals.pl /opt/dss/Perl/tag_vals.pl ``` #### 步骤 2:修改 Perl 模块搜索路径 编辑 DSS 启动脚本(通常是 `/usr/local/sbin/streamingadminserver.pl`): ```perl{3-4} #!/usr/bin/perl # 在开头添加以下两行(替换为实际路径) use lib '/usr/local/streaming/AdminHtml'; # 添加自定义模块路径 use lib '/opt/dss/Perl'; # 添加第二个备选路径 ``` #### 步骤 3:验证文件权限 确保 Perl 进程有权限访问该文件: ```bash sudo chmod +r /usr/local/streaming/AdminHtml/tag_vals.pl sudo chown -R www-data:www-data /usr/local/streaming/ # 根据实际运行用户调整 ``` #### 步骤 4:检查环境变量 在启动脚本中添加环境变量声明: ```bash{3-4} #!/bin/bash # 启动 DSS 前设置 PERL5LIB export PERL5LIB="/usr/local/streaming/AdminHtml:/opt/dss/Perl" /usr/local/sbin/streamingadminserver.pl ``` #### 步骤 5:重启服务 ```bash sudo pkill -f streamingadminserver sudo /usr/local/sbin/streamingadminserver.pl ``` #### 步骤 6:验证修复 访问 `http://127.0.0.1:1220` 或检查日志: ```bash tail -f /var/streaming/logs/streamingadminserver.log # 成功日志应显示:Loading tag_vals.pl from /usr/local/streaming/AdminHtml ``` --- ### 高级调试技巧 1. **检查当前 Perl 路径**: ```bash perl -e 'print join("\n", @INC)' ``` 2. **强制指定路径**(临时测试): ```bash perl -I /usr/local/streaming/AdminHtml /usr/local/sbin/streamingadminserver.pl ``` 3. **符号链接方案**(备选): ```bash sudo ln -s /usr/local/streaming/AdminHtml/tag_vals.pl /usr/local/share/perl/5.30.0/ ``` --- ### 常见问题排查表 | 现象 | 解决方案 | |------|----------| | **修改后仍报错** | 检查脚本开头是否有多余空格/BOM字符 | | **权限拒绝** | 使用 `sudo -u www-data perl -c tag_vals.pl` 测试 | | **多版本冲突** | 删除重复文件:`sudo rm /path/to/duplicate/tag_vals.pl` | | **SELinux 拦截** | 执行:`sudo setenforce 0` 临时禁用测试 | > **关键提示**:如果使用 Docker 容器部署,需确保卷挂载路径与容器内 Perl 路径一致[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值