【问题标题】:undefined reference to espeak using cmake使用 cmake 对 espeak 的未定义引用
【发布时间】:2023-03-27 02:31:01
【问题描述】:

我正在处理这个project,这是一个相关的issue 我已经用 Espeak TTs 引擎替换了 TTS flite 引擎,所以我不得不修改 CmakeLists.txt

find_package(Espeak REQUIRED)
include_directories(${Espeak_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Espeak_LIBRARIES})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR} /cmake/Modules/")
if (NOT Espeak_Found)
    message(FATAL_ERROR "Package Espeak required, but not found!")
endif(NOT Espeak_Found)

因为默认不支持 FindEspeak.cmake 所以我将文件添加到 cmake 默认模块路径,编译项目并得到以下错误

Linking CXX executable TextReading
CMakeFiles/TextReading.dir/EspeakBridge.cpp.o:(.bss+0x0): multiple definition of `samplerate'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:(.bss+0x0): first defined here
CMakeFiles/TextReading.dir/EspeakBridge.cpp.o:(.bss+0x10): multiple definition of `sounddata'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:(.bss+0x10): first defined here
CMakeFiles/TextReading.dir/EspeakBridge.cpp.o:(.bss+0x28): multiple definition of `counter'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:(.bss+0x28): first defined here
CMakeFiles/TextReading.dir/EspeakBridge.cpp.o:(.bss+0x30): multiple definition of `waves'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:(.bss+0x30): first defined here
CMakeFiles/TextReading.dir/EspeakBridge.cpp.o: In function `SynthCallback(short*, int, espeak_EVENT*)':
EspeakBridge.cpp:(.text+0x0): multiple definition of `SynthCallback(short*, int, espeak_EVENT*)'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:EspeakTTSWorker.cpp: (.text+0x0): first defined here
CMakeFiles/TextReading.dir/moc_EspeakTTSWorker.cxx.o:(.bss+0x0): multiple definition of `samplerate'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:(.bss+0x0): first defined here
CMakeFiles/TextReading.dir/moc_EspeakTTSWorker.cxx.o:(.bss+0x10): multiple definition of `sounddata'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:(.bss+0x10): first defined here
CMakeFiles/TextReading.dir/moc_EspeakTTSWorker.cxx.o:(.bss+0x28): multiple definition of `counter'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:(.bss+0x28): first defined here
CMakeFiles/TextReading.dir/moc_EspeakTTSWorker.cxx.o:(.bss+0x30): multiple definition of `waves'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:(.bss+0x30): first defined here
 CMakeFiles/TextReading.dir/moc_EspeakTTSWorker.cxx.o: In function `SynthCallback(short*, int, espeak_EVENT*)':
 moc_EspeakTTSWorker.cxx:(.text+0x0): multiple definition of `SynthCallback(short*, int, espeak_EVENT*)'
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o:EspeakTTSWorker.cpp:(.text+0x0): first defined here
CMakeFiles/TextReading.dir/EspeakTTSWorker.cpp.o: In function `EspeakTTSWorker::run()':
 EspeakTTSWorker.cpp:(.text+0x118): undefined reference to `espeak_Initialize'
 CMakeFiles/TextReading.dir/EspeakBridge.cpp.o: In function `EspeakBridge::init()':
 EspeakBridge.cpp:(.text+0x93): undefined reference to `espeak_Initialize'
  EspeakBridge.cpp:(.text+0x9d): undefined reference to `espeak_SetVoiceByName'
  EspeakBridge.cpp:(.text+0xa7): undefined reference to `espeak_SetSynthCallback'
  CMakeFiles/TextReading.dir/EspeakBridge.cpp.o: In function  `EspeakBridge::close()':
  EspeakBridge.cpp:(.text+0x173): undefined reference to `espeak_Terminate'
  CMakeFiles/TextReading.dir/EspeakBridge.cpp.o: In function `EspeakTTSWorker::setText(std::string const&)':
   EspeakBridge.cpp:(.text._ZN15EspeakTTSWorker7setTextERKSs[_ZN15EspeakTTSWorker7setTextERKSs]+0x121): undefined reference to `espeak_Synth'
   EspeakBridge.cpp:(.text._ZN15EspeakTTSWorker7setTextERKSs[_ZN15EspeakTTSWorker7setTextERKSs]+0x126): undefined reference to `espeak_Synchronize'
  collect2: error: ld returned 1 exit status
  make[2]: *** [TextReading] Error 1
  make[1]: *** [CMakeFiles/TextReading.dir/all] Error 2
  make: *** [all] Error 2`

我该怎么办?

【问题讨论】:

  • 你应该链接到espeak。并学习一些 CMake,这是每个 CMake 操作方法的内容!
  • 我说我在更多搜索后编辑了 cmakelists 文件。

标签: cmake espeak


【解决方案1】:

我刚刚编辑了 Espeak 参数

 ############ Find ESPEAK TTS ############ 

find_path(LIBESPEAK_INCLUDE_DIRS 
          NAMES speak_lib.h
          HINTS /usr/include/espeak)
find_library(LIBESPEAK_LIBRARIES
             NAMES espeak
             HINTS /usr/lib/ /usr/x86_64-linux-gnu/
             PATH_SUFFIXES lib)

######################################## 


add_executable(TextReading 
        ${DAD_SOURCES} 
        ${DAD_HEADERS} 
        ${MY_UI_HDRS} 
        ${MY_MOC_SRCS} 
    ${MY_CUDA_COMPILED_FILES} 
    ${QEXTSERIALPORT_SOURCES} ${QEXTSERIALPORT_HEADERS} 
    ) 

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 2018-04-12
    • 2012-01-27
    • 1970-01-01
    • 2012-10-07
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多