2017-11-28 1 views
1

Swift 프로젝트 (Xcode 9.1, macOS 10.13)가 있고 Swift로 C 파일의 헤더를 브리징하여 ViewController.swift와 자체 C 라이브러리를 연결하려고했습니다.Apple Mach-O Linker 오류 _

Screen of my project

그러나, comilation 오류가 발생하고, 이것은 출력 : 내가 잘못

 

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) 

을 뭐하는 거지? DerivedData에서 모든 파일을 삭제하려고했지만 동일한 프로젝트 (제품 별/클리닝 별)에서도 청소를 시도했지만 문제는 변경되지 않았습니다.

답변

1

이것은 실제로 컴파일 오류가 아닙니다. 이것은 링커 오류입니다 : Swift와 C 코드는 잘 컴파일되었지만 다른 라이브러리의 컴파일 된 코드는 발견되지 않았으므로 모든 부분을 서로 연결할 수 없었습니다.

사진에서 짐작할 수 있듯이 flite_hts_engine.cflite_hts_engine.h 파일에 htsEngineLib의 다른 C 코드 주위에 C 래퍼를 작성했다고 가정합니다. 예를 들어, _Flite_HTS_Engine_initialize은 랩퍼에있을 수 있으며 라이브러리에서 _HTS_Engine_initialize을 사용하려하지만 (컴파일 된) 코드를 사용할 수 없거나 잘못된 아키텍처에 사용 가능한 코드 일 수 있습니다.

이 문제의 해결 방법은 htsEngineLib의 소스 코드가 있는지 여부와 같은 세부 사항에 따라 달라집니다. 그렇다면 간단한 솔루션을 프로젝트의 일부로 만드는 것이 좋습니다. 컴파일 된 라이브러리 만있는 경우 올바른 아키텍처를위한 라이브러리인지 확인해야합니다. 예를 들어 iPhone 용으로 제공된 컴파일 된 라이브러리가있는 경우이를 사용하여 macOS 또는 iPhone 시뮬레이터 용 앱을 빌드 할 수 없습니다.

+0

hts_engineLib의 모든 라이브러리에 소스 파일을 추가 한 후 링커 오류가 사라지고 6 번의 컴파일 오류가 나타나지만 오류가 발생하면 66 개의 링커 오류가 발생합니다. 개체 파일 (.o)을 모든 원본 파일에 추가하려고 시도했지만 오류가 계속 발생합니다. 어쩌면 C warpper, .c 및 .h 파일에 C 래퍼를 작성하는 방법 때문일 수 있습니까? – NoraQm

+0

일반적인 컴파일 링커 오류는 무엇입니까? 컴파일 문제를 어떻게 수정 했습니까? .o 파일을 프로젝트에 추가 했습니까? 절대 수행해서는 안되며 소스 코드가 아닙니다. 왜 htsEngineLib 주위에 래퍼를 만들려고 했습니까? 인터페이스를 단순화하거나 C++의 lib입니까? SO와 웹에 대한 많은 정보가 일반적으로 래퍼 작성에 관해 있습니다. – OmniProg

관련 문제