【问题标题】:Apple Mach-O Linker Error_Apple Mach-O 链接器错误_
【发布时间】:2025-12-10 23:15:02
【问题描述】:

我有一个 Swift 项目(Xcode 9.1,macOS 10.13),我尝试通过使用 Swift 为 C 文件做桥接头,将我自己的 C 库与 ViewController.swift 链接起来。

但是出现编译错误,输出如下:

架构 x86_64 的未定义符号: “_HTS_Engine_clear”,引用自: flite_hts_engine.o 中的 _Flite_HTS_Engine_clear (也许你的意思是:_Flite_HTS_Engine_clear) “_ffeature_string”,引用自: flite_hts_engine.o 中的 _create_label flite_hts_engine.o 中的 _Flite_Text_Analyzer_get_phoneme flite_hts_engine.o 中的 _Flite_Text_Analyzer_get_word “_val_string_n”,引用自: flite_hts_engine.o 中的 _create_label “_HTS_Engine_initialize”,引用自: _Flite_HTS_Engine_initialize 在 flite_hts_engine.o (也许你的意思是:_Flite_HTS_Engine_initialize) “_HTS_Engine_set_speed”,引用自: _Flite_HTS_Engine_set_speed 在 flite_hts_engine.o (也许您的意思是:_Flite_HTS_Engine_set_speed) “_register_cmu_us_kal”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o flite_hts_engine.o 中的_Flite_Text_Analyzer_analysis “_relation_head”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o flite_hts_engine.o 中的_Flite_Text_Analyzer_analysis flite_hts_engine.o 中的 _Flite_Text_Analyzer_get_label_data “_item_next”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o flite_hts_engine.o 中的 _create_label flite_hts_engine.o 中的_Flite_Text_Analyzer_analysis flite_hts_engine.o 中的 _Flite_Text_Analyzer_get_label_data “_utt_relation”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o flite_hts_engine.o 中的_Flite_Text_Analyzer_analysis flite_hts_engine.o 中的 _Flite_Text_Analyzer_get_label_data “_HTS_Engine_refresh”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o “_HTS_Engine_set_volume”,引用自: flite_hts_engine.o 中的 _Flite_HTS_Engine_set_volume (也许你的意思是:_Flite_HTS_Engine_set_volume) “_delete_utterance”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o flite_hts_engine.o 中的_Flite_Text_Analyzer_analysis flite_hts_engine.o 中的 _Flite_Text_Analyzer_clear “_unregister_cmu_us_kal”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o flite_hts_engine.o 中的_Flite_Text_Analyzer_analysis flite_hts_engine.o 中的 _Flite_Text_Analyzer_clear “_HTS_Engine_save_riff”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o “_flite_synth_text”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o flite_hts_engine.o 中的_Flite_Text_Analyzer_analysis “_HTS_Engine_set_msd_threshold”,引用自: flite_hts_engine.o 中的 _Flite_HTS_Engine_set_msd_threshold (也许你的意思是:_Flite_HTS_Engine_set_msd_threshold) “_HTS_Engine_set_beta”,引用自: _Flite_HTS_Engine_set_beta 在 flite_hts_engine.o (也许你的意思是:_Flite_HTS_Engine_set_beta) “_HTS_Engine_add_half_tone”,引用自: _Flite_HTS_Engine_add_half_tone 在 flite_hts_engine.o (也许你的意思是:_Flite_HTS_Engine_add_half_tone) “_val_string”,引用自: flite_hts_engine.o 中的 _create_label “_HTS_Engine_set_alpha”,引用自: flite_hts_engine.o 中的 _Flite_HTS_Engine_set_alpha (也许你的意思是:_Flite_HTS_Engine_set_alpha) “_HTS_Engine_set_gv_weight”,引用自: _Flite_HTS_Engine_set_gv_weight 在 flite_hts_engine.o (也许你的意思是:_Flite_HTS_Engine_set_gv_weight) “_HTS_Engine_synthesize_from_strings”,引用自: _Flite_HTS_Engine_synthesize 在 flite_hts_engine.o “_HTS_Engine_set_sampling_frequency”,引用自: _Flite_HTS_Engine_set_sampling_frequency 在 flite_hts_engine.o (也许你的意思是:_Flite_HTS_Engine_set_sampling_frequency) “_HTS_Engine_set_fperiod”,引用自: flite_hts_engine.o 中的 _Flite_HTS_Engine_set_fperiod (也许你的意思是:_Flite_HTS_Engine_set_fperiod) “_ffeature_int”,引用自: flite_hts_engine.o 中的 _create_label _Flite_Text_Analyzer_get_nphoneme_in_syllable 在 flite_hts_engine.o _Flite_Text_Analyzer_get_nsyllable_in_word 在 flite_hts_engine.o _Flite_Text_Analyzer_get_nword_in_phrase 在 flite_hts_engine.o flite_hts_engine.o 中的 _Flite_Text_Analyzer_get_nphrase_in_utterance flite_hts_engine.o 中的 _Flite_Text_Analyzer_get_accent flite_hts_engine.o 中的 _Flite_Text_Analyzer_get_stress ... “_HTS_Engine_load”,引用自: flite_hts_engine.o 中的 _Flite_HTS_Engine_load (也许你的意思是:_Flite_HTS_Engine_load) “_HTS_Engine_set_audio_buff_size”,引用自: _Flite_HTS_Engine_set_audio_buff_size 在 flite_hts_engine.o (也许你的意思是:_Flite_HTS_Engine_set_audio_buff_size) ld:未找到架构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

我做错了什么? 我试图删除 DerivedData 上的所有文件,也在同一个项目中清理(通过 Product/Clean),但问题没有改变。

【问题讨论】:

    标签: ios c swift xcode compiler-errors


    【解决方案1】:

    这实际上不是编译错误。这是一个链接器错误:Swift 和你的 C 代码编译得很好,但是没有找到来自其他库的编译代码,所以所有部分都无法链接在一起。

    根据您的图片猜测,我假设您在 flite_hts_engine.cflite_hts_engine.h 文件中编写了一个 C 包装器,以及 htsEngineLib 中的一些其他 C 代码。例如,_Flite_HTS_Engine_initialize 可能在包装器中并尝试在库中使用_HTS_Engine_initialize,但该(编译)代码不可用,或者可用代码可能用于错误的体系结构。

    这个问题的解决取决于你是否有htsEngineLib的源代码等细节。如果你这样做了,一个简单的解决方案可能就是让它成为你项目的一部分。如果您只有一个已编译的库,那么您必须确保该库适用于正确的架构。例如,如果您有为 iPhone 提供的编译库,则不能使用它来构建适用于 macOS 或 iPhone 模拟器的应用程序。

    【讨论】:

    • 在我为 hts_engineLib 中的所有库添加源文件(通过拖放方式)后,链接器错误消失了,然后它们出现了 6 个编译错误,我更正了它们,但之后它们发生了 66 个链接器错误.我尝试为所有源文件添加目标文件(.o),但错误仍然发生。可能是因为 C 包装器,如何在 .c 和 .h 文件中编写 C 包装器?
    • 典型的编译和链接器错误是什么?你是如何解决编译问题的?您是否将 .o 文件添加到项目中?永远不应该这样做,它们不是源代码。你为什么首先尝试围绕 htsEngineLib 创建一个包装器?是为了简化接口,还是C++中的lib?在 SO 和网络上有很多关于编写包装器的信息。