编译iOS程序时的-all_load选项,以及-all_load 导致的 ld duplicate symbol xx的问题

本文介绍了解决iOS应用中集成百度地图SDK时出现的unrecognizedselector及Unknownclass错误的方法。通过调整BuildSettings中的OtherLinkerFlags设置为-ObjC,解决了由于Category加载不完全导致的问题。

在新的SDK环境中调试百度地图的应用程序时,app总是意外退出,找了半天发现错误的原因是unrecognized selector xx的错误,另外还有报了一个Unknown class XXX in Interface Builder file的错误,找了一下百度官方的资料,官方建议是app的Build Settings中的Other Linker Flags中增加-all_oad选项,但是我的app中还连接了其他静态库,加了这个选项之后,编译的时候报了 ld duplicate symbol xx的错误,于是又去苹果官网找了一下资料,发现有个类似功能的选项-ObjC,在编译选项中将-all_load改为-ObjC后,app编译和运行正常,附上apple官方的介绍:

https://developer.apple.com/library/mac/#qa/qa2006/qa1490.html

官方的说明是app中链接的静态库中使用了Category(类别),在编译到静态库时,这些代码模块实际上是存在不同的obj文件里的。程序在连接Category方法时,实际上只加载了Category模块,扩展的基类代码并没有被加载。这样,程序虽然可以编译通过,但是在运行时,因为找不到基类模块,就会出现unrecognized selector 这样的错误。-all_load就是解决上述问题,类似的还可以用-force_load、-ObjC。 再附上一个相关的资料:

http://stackoverflow.com/questions/2300867/how-can-i-avoid-duplicate-symbol-errors-in-xcode-with-shared-static-libraries/2300873#2300873



报错:15:14:55.528 INFO NativeLibraryLoader - Loading libgkl_compression.so from jar:file:/public/home/xiaoshunpeng/miniconda3/envs/chip-seq/share/picard-3.4.0-0/picard.jar!/com/intel/gkl/native/libgkl_compression.so [Sat Jul 26 15:14:55 CST 2025] MarkDuplicates --INPUT /public/home/xiaoshunpeng/chip_samtools/P-T-H-K16-1/paired_aligned_sorted.bam --OUTPUT /public/home/xiaoshunpeng/chip_picard/P-T-H-K16-1/picard-1.bam --METRICS_FILE /public/home/xiaoshunpeng/chip_picard/P-T-H-K16-1/picard-1.metrics --REMOVE_DUPLICATES true --ASSUME_SORTED true --CREATE_INDEX true --MAX_SEQUENCES_FOR_DISK_READ_ENDS_MAP 50000 --MAX_FILE_HANDLES_FOR_READ_ENDS_MAP 8000 --SORTING_COLLECTION_SIZE_RATIO 0.25 --TAG_DUPLICATE_SET_MEMBERS false --REMOVE_SEQUENCING_DUPLICATES false --TAGGING_POLICY DontTag --CLEAR_DT true --DUPLEX_UMI false --FLOW_MODE false --FLOW_DUP_STRATEGY FLOW_QUALITY_SUM_STRATEGY --FLOW_USE_END_IN_UNPAIRED_READS false --FLOW_USE_UNPAIRED_CLIPPED_END false --FLOW_UNPAIRED_END_UNCERTAINTY 0 --FLOW_UNPAIRED_START_UNCERTAINTY 0 --FLOW_SKIP_FIRST_N_FLOWS 0 --FLOW_Q_IS_KNOWN_END false --FLOW_EFFECTIVE_QUALITY_THRESHOLD 15 --ADD_PG_TAG_TO_READS true --DUPLICATE_SCORING_STRATEGY SUM_OF_BASE_QUALITIES --PROGRAM_RECORD_ID MarkDuplicates --PROGRAM_GROUP_NAME MarkDuplicates --READ_NAME_REGEX <optimized capture of last three ':' separated fields as numeric values> --OPTICAL_DUPLICATE_PIXEL_DISTANCE 100 --MAX_OPTICAL_DUPLICATE_SET_SIZE 300000 --VERBOSITY INFO --QUIET false --VALIDATION_STRINGENCY STRICT --COMPRESSION_LEVEL 5 --MAX_RECORDS_IN_RAM 500000 --CREATE_MD5_FILE false --help false --version false --showHidden false --USE_JDK_DEFLATER false --USE_JDK_INFLATER false
最新发布
07-27
<think>我们注意到报错信息中包含了大量的默认参数,这些参数在命令行中并未指定,但是被自动添加了。这可能是由于Picard工具内部设置的默认参数。然而,从报错信息来看,并没有明显的错误,只是显示了运行的参数配置。但是用户可能遇到了程序运行失败或者未达到预期的情况。 但是,根据之前的问题,用户可能是在参数格式上遇到了问题。之前的警告是混合使用了新旧参数格式,现在用户已经统一使用新格式(长选项),但是运行后出现了大量的默认参数输出,这通常是Picard在INFO级别日志中打印的。 如果程序运行成功,则不需要担心;如果运行失败,我们需要查看具体的错误信息。然而,用户提供的日志中没有错误,只有INFO信息。 但是,请注意:在提供的命令中,有一个参数`--ASSUME_SORTED`,在Picard MarkDuplicates中,正确的参数名应该是`--ASSUME_SORT_ORDER`(指定排序顺序,如coordinate, queryname等)或者`--ASSUME_SORTED`(布尔值,表示是否假设已排序,但已过时)。在Picard 3.4.0版本中,推荐使用`--ASSUME_SORT_ORDER`。 因此,我们可能需要将`--ASSUME_SORTED true`改为`--ASSUME_SORT_ORDER coordinate`(假设输入文件是按坐标排序的,这是常见的)。 另外,注意`--REMOVE_DUPLICATES`参数,如果设置为true,则会实际删除重复的reads,而不是仅仅标记。 如果用户希望按照坐标排序的BAM文件进行去重,那么应该使用`--ASSUME_SORT_ORDER coordinate`。 修改后的命令如下:</think>### 解决 Picard MarkDuplicates 日志信息问题 您提供的不是错误信息,而是 Picard 工具的标准运行日志。这些信息表示程序正在正常执行,显示了加载的库和完整的参数配置。以下是关键分析和优化建议: #### 1. 日志信息解析 ```plaintext 15:14:55.528 INFO NativeLibraryLoader - Loading libgkl_compression.so ``` - **含义**:Picard 正在加载 Intel Genomics Kernel Library (GKL) 压缩库 - **作用**:加速 BAM 文件的压缩/解压缩操作 - **正常性**:这是标准启动过程,非错误 ```plaintext [Sat Jul 26 15:14:55 CST 2025] MarkDuplicates --INPUT ... --OUTPUT ... ``` - **含义**:显示完整的命令行参数配置 - **作用**:提供执行环境的完整记录,便于调试 - **包含**:所有显式设置的参数 + 默认参数值 #### 2. 优化参数配置建议 当前命令: ```bash picard MarkDuplicates \ --INPUT /path/to/input.bam \ --OUTPUT /path/to/output.bam \ --METRICS_FILE /path/to/metrics.txt \ --REMOVE_DUPLICATES true \ --ASSUME_SORTED true \ --CREATE_INDEX true ``` 优化建议: ```bash picard MarkDuplicates \ --INPUT /path/to/input.bam \ --OUTPUT /path/to/output.bam \ --METRICS_FILE /path/to/metrics.txt \ --REMOVE_DUPLICATES true \ --ASSUME_SORT_ORDER coordinate \ # 更精确的排序假设 --CREATE_INDEX true \ --VALIDATION_STRINGENCY LENIENT \ # 处理格式不规范数据 --TAGGING_POLICY All \ # 标记所有重复reads --OPTICAL_DUPLICATE_PIXEL_DISTANCE 100 # 光学重复检测 ``` #### 3. 关键参数解释 | 参数 | 当前值 | 推荐值 | 说明 | |------|--------|--------|------| | `ASSUME_SORTED` | true | `--ASSUME_SORT_ORDER coordinate` | 更精确指定排序类型 | | `VALIDATION_STRINGENCY` | (默认STRICT) | LENIENT | 宽松处理格式问题 | | `TAGGING_POLICY` | (默认DontTag) | All | 标记重复reads | | `MAX_RECORDS_IN_RAM` | 500000 | 根据内存调整 | 控制内存使用 | | `COMPRESSION_LEVEL` | 5 | 1 (最快) 或 9 (最小) | 压缩级别平衡 | #### 4. 内存优化配置 ```bash # 示例:针对大文件的优化配置 picard -Xmx8G MarkDuplicates \ # 分配8GB内存 --INPUT large_file.bam \ --OUTPUT deduped.bam \ --METRICS_FILE metrics.txt \ --ASSUME_SORT_ORDER coordinate \ --CREATE_INDEX true \ --MAX_RECORDS_IN_RAM 1000000 \ # 增加内存记录数 --OPTICAL_DUPLICATE_PIXEL_DISTANCE 100 \ --TAGGING_POLICY OpticalOnly \ # 只标记光学重复 --COMPRESSION_LEVEL 1 # 最快压缩 ``` #### 5. 完整执行监控脚本 ```bash #!/bin/bash # picard_monitor.sh INPUT_BAM="/public/home/.../paired_aligned_sorted.bam" OUTPUT_BAM="/public/home/.../picard-1.bam" METRICS_FILE="/public/home/.../picard-1.metrics" LOG_FILE="/public/home/.../picard_log.txt" # 启动时间记录 start_time=$(date +%s) # 执行Picard并记录资源使用 /usr/bin/time -v -o time.log picard MarkDuplicates \ --INPUT "$INPUT_BAM" \ --OUTPUT "$OUTPUT_BAM" \ --METRICS_FILE "$METRICS_FILE" \ --REMOVE_DUPLICATES true \ --ASSUME_SORT_ORDER coordinate \ --CREATE_INDEX true \ --VALIDATION_STRINGENCY LENIENT \ --TAGGING_POLICY All \ 2>&1 | tee "$LOG_FILE" # 结束时间记录 end_time=$(date +%s) # 生成报告 echo "===== PROCESSING REPORT =====" echo "Start time: $(date -d @$start_time)" echo "End time: $(date -d @$end_time)" echo "Duration: $((end_time - start_time)) seconds" # 添加资源使用报告 cat time.log rm time.log # 验证输出 echo -e "\n===== OUTPUT VERIFICATION =====" ls -lh "$OUTPUT_BAM" samtools quickcheck "$OUTPUT_BAM" && echo "BAM file is valid" ``` ### 常见问题解答 **Q: 为什么显示这么多参数?** A: Picard 默认打印完整的参数配置,包括: - 用户显式设置的参数 - 所有默认参数值 - 内部优化参数(如 `READ_NAME_REGEX`) **Q: 如何减少日志输出?** ```bash # 添加日志控制参数 picard MarkDuplicates \ ... \ --VERBOSITY ERROR \ # 只显示错误 --QUIET true # 完全静默模式 ``` **Q: 如何确认程序成功执行?** 1. 检查退出代码:`echo $?` (0表示成功) 2. 验证输出文件存在且非空 3. 检查日志结尾是否有成功信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值