2017-11-28 4 views
1

Ich habe ein Swift-Projekt (Xcode 9.1, macOS 10.13), und ich habe versucht, meine eigene C-Bibliothek mit der ViewController.swift zu verknüpfen, indem Bridging Header für C-Datei mit Swift.Apple Mach-O Linker Error_

Screen of my project

Allerdings wurde der comilation Fehler aufgetreten, und das ist Ausgabe:

 

Undefined symbols for architecture x86_64: 
    "_HTS_Engine_clear", referenced from: 
     _Flite_HTS_Engine_clear in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_clear) 
    "_ffeature_string", referenced from: 
     _create_label in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_phoneme in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_word in flite_hts_engine.o 
    "_val_string_n", referenced from: 
     _create_label in flite_hts_engine.o 
    "_HTS_Engine_initialize", referenced from: 
     _Flite_HTS_Engine_initialize in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_initialize) 
    "_HTS_Engine_set_speed", referenced from: 
     _Flite_HTS_Engine_set_speed in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_set_speed) 
    "_register_cmu_us_kal", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
     _Flite_Text_Analyzer_analysis in flite_hts_engine.o 
    "_relation_head", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
     _Flite_Text_Analyzer_analysis in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_label_data in flite_hts_engine.o 
    "_item_next", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
     _create_label in flite_hts_engine.o 
     _Flite_Text_Analyzer_analysis in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_label_data in flite_hts_engine.o 
    "_utt_relation", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
     _Flite_Text_Analyzer_analysis in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_label_data in flite_hts_engine.o 
    "_HTS_Engine_refresh", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
    "_HTS_Engine_set_volume", referenced from: 
     _Flite_HTS_Engine_set_volume in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_set_volume) 
    "_delete_utterance", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
     _Flite_Text_Analyzer_analysis in flite_hts_engine.o 
     _Flite_Text_Analyzer_clear in flite_hts_engine.o 
    "_unregister_cmu_us_kal", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
     _Flite_Text_Analyzer_analysis in flite_hts_engine.o 
     _Flite_Text_Analyzer_clear in flite_hts_engine.o 
    "_HTS_Engine_save_riff", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
    "_flite_synth_text", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
     _Flite_Text_Analyzer_analysis in flite_hts_engine.o 
    "_HTS_Engine_set_msd_threshold", referenced from: 
     _Flite_HTS_Engine_set_msd_threshold in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_set_msd_threshold) 
    "_HTS_Engine_set_beta", referenced from: 
     _Flite_HTS_Engine_set_beta in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_set_beta) 
    "_HTS_Engine_add_half_tone", referenced from: 
     _Flite_HTS_Engine_add_half_tone in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_add_half_tone) 
    "_val_string", referenced from: 
     _create_label in flite_hts_engine.o 
    "_HTS_Engine_set_alpha", referenced from: 
     _Flite_HTS_Engine_set_alpha in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_set_alpha) 
    "_HTS_Engine_set_gv_weight", referenced from: 
     _Flite_HTS_Engine_set_gv_weight in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_set_gv_weight) 
    "_HTS_Engine_synthesize_from_strings", referenced from: 
     _Flite_HTS_Engine_synthesize in flite_hts_engine.o 
    "_HTS_Engine_set_sampling_frequency", referenced from: 
     _Flite_HTS_Engine_set_sampling_frequency in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_set_sampling_frequency) 
    "_HTS_Engine_set_fperiod", referenced from: 
     _Flite_HTS_Engine_set_fperiod in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_set_fperiod) 
    "_ffeature_int", referenced from: 
     _create_label in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_nphoneme_in_syllable in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_nsyllable_in_word in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_nword_in_phrase in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_nphrase_in_utterance in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_accent in flite_hts_engine.o 
     _Flite_Text_Analyzer_get_stress in flite_hts_engine.o 
     ... 
    "_HTS_Engine_load", referenced from: 
     _Flite_HTS_Engine_load in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_load) 
    "_HTS_Engine_set_audio_buff_size", referenced from: 
     _Flite_HTS_Engine_set_audio_buff_size in flite_hts_engine.o 
    (maybe you meant: _Flite_HTS_Engine_set_audio_buff_size) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Was mache ich falsch? Ich habe versucht, alle Dateien auf DerivedData zu löschen, auch in meinem Projekt (nach Product/Clean) zu reinigen, aber das Problem nicht geändert.

Antwort

1

Dies ist kein Kompilierungsfehler. Es ist ein Linker-Fehler: Der Swift und Ihr C-Code wurde gut kompiliert, aber dann wurde der kompilierte Code aus einer anderen Bibliothek nicht gefunden, so dass alle Teile nicht miteinander verknüpft werden konnten.

Ausgehend von Ihren Bildern nehme ich an, dass Sie einen C-Wrapper geschrieben haben, in den Dateien flite_hts_engine.c und flite_hts_engine.h, um einen anderen C-Code in htsEngineLib. Zum Beispiel könnte _Flite_HTS_Engine_initialize im Wrapper sein und versucht, _HTS_Engine_initialize in der Bibliothek zu verwenden, aber dieser (kompilierte) Code ist nicht verfügbar, oder der verfügbare Code ist für eine falsche Architektur.

Die Lösung dieses Problems hängt von den Details ab, z. B. ob Sie den Quellcode für htsEngineLib haben. Wenn du das tust, könnte es eine einfache Lösung sein, es einfach in dein Projekt zu integrieren. Wenn Sie nur eine kompilierte Bibliothek haben, müssen Sie sicherstellen, dass die Bibliothek für die richtige Architektur geeignet ist. Wenn Sie zum Beispiel eine kompilierte Bibliothek für das iPhone bereitgestellt haben, können Sie damit keine App für den MacOS- oder iPhone-Simulator erstellen.

+0

Nachdem ich die Quelldatei (per Drag & Drop) für alle Bibliotheken in hts_engineLib hinzugefügt hatte, verschwanden die Linkerfehler, dann erschienen 6 Kompilierungsfehler, ich korrigiere sie, aber danach 66 Linkfehler. Ich habe versucht, die Objektdatei (.o) für alle Quelldateien hinzuzufügen, aber der Fehler tritt immer noch auf. vielleicht weil der C Warmer, Wie schreibt man einen C-Wrapper in .c und .h Dateien? – NoraQm

+0

Was waren die typischen Kompilierungs- und Linkerfehler? Wie hast du die Kompilierungsprobleme behoben? Haben Sie dem Projekt O-Dateien hinzugefügt? Das sollte nie gemacht werden, sie sind kein Quellcode. Warum hast du versucht, einen Wrapper um htsEngineLib zu erstellen? Um die Schnittstelle zu vereinfachen, oder ist die Lib in C++? Es gibt eine Menge Informationen über SO und Web im Allgemeinen über das Schreiben von Wrappern. – OmniProg

Verwandte Themen