CMake 依赖目标不存在。

3
我有以下脚本来构建我的一个项目:
CMAKE_MINIMUM_REQUIRED(VERSION 3.0.2)
INCLUDE(ExternalProject)
SET(PROJECT_NAME Khronos)
PROJECT(${PROJECT_NAME})
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
SET_DIRECTORY_PROPERTIES(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/library-build)

FIND_PACKAGE(sphinxbase)
if (${SPHINXBASE_FOUND})
    INCLUDE_DIRECTORIES(${SPHINXBASE_INCLUDE_DIR}/sphinxbase/)
else ()
    ExternalProject_Add(
        sphinxbase
        GIT_REPOSITORY      "https://github.com/cmusphinx/sphinxbase.git"
        GIT_TAG             "e34b1c632392276101ed16e8a05862e43f038a7c"
        SOURCE_DIR          ${CMAKE_CURRENT_SOURCE_DIR}/lib/sphinxbase
        CONFIGURE_COMMAND   ${CMAKE_CURRENT_SOURCE_DIR}/lib/sphinxbase/autogen.sh
        BUILD_COMMAND       make
        UPDATE_COMMAND      ""
        INSTALL_COMMAND     make install
        BUILD_IN_SOURCE     ON
        LOG_DOWNLOAD        ON
        LOG_UPDATE          ON
        LOG_CONFIGURE       ON
        LOG_BUILD           ON
        LOG_TEST            ON
        LOG_INSTALL         ON
    )
    ExternalProject_Get_Property(sphinxbase SOURCE_DIR)
    ExternalProject_Get_Property(sphinxbase BINARY_DIR)
    SET(SPHINXBASE_SOURCE_DIR ${SOURCE_DIR})
    SET(SPHINXBASE_BINARY_DIR ${BINARY_DIR})
    SET(SPHINXBASE_LIBRARIES ${SPHINXBASE_BINARY_DIR}/src/libsphinxbase/.libs/libsphinxbase.a)
    INCLUDE_DIRECTORIES(${SPHINXBASE_SOURCE_DIR}/include)
endif ()
SET(DEPENDENCIES ${DEPENDENCIES} sphinxbase)
SET(LIBS ${LIBS} ${SPHINXBASE_LIBRARIES})

FIND_PACKAGE(pocketsphinx)
if (${POCKETSPHINX_FOUND})
    INCLUDE_DIRECTORIES(${POCKETSPHINX_INCLUDE_DIR}/pocketsphinx/)
    add_definitions( -DMODELDIR="/usr/local/share/pocketsphinx/model")  # TODO: more portable
    SET(DEPENDENCIES ${DEPENDENCIES} pocketsphinx)
else ()
    ExternalProject_Add(
        pocketsphinx
        DEPENDS             sphinxbase
        GIT_REPOSITORY      "https://github.com/cmusphinx/pocketsphinx.git"
        GIT_TAG             "0d41af2efe3f77a3e7f22a54e42684bb1562876d"
        SOURCE_DIR          ${CMAKE_CURRENT_SOURCE_DIR}/lib/pocketsphinx
        CONFIGURE_COMMAND   ${CMAKE_CURRENT_SOURCE_DIR}/lib/pocketsphinx/autogen.sh --prefix=<INSTALL_DIR> --with-sphinxbase=${SPHINXBASE_BINARY_DIR}
        BUILD_COMMAND       make
        UPDATE_COMMAND      ""
        INSTALL_COMMAND     make install
        BUILD_IN_SOURCE     ON
        LOG_DOWNLOAD        ON
        LOG_UPDATE          ON
        LOG_CONFIGURE       ON
        LOG_BUILD           ON
        LOG_TEST            ON
        LOG_INSTALL         ON
        )
    ExternalProject_Get_Property(pocketsphinx SOURCE_DIR)
    ExternalProject_Get_Property(pocketsphinx BINARY_DIR)
    SET(POCKETSPHINX_SOURCE_DIR ${SOURCE_DIR})
    SET(POCKETSPHINX_BINARY_DIR ${BINARY_DIR})
    SET(POCKETSPHINX_LIBRARIES ${POCKETSPHINX_BINARY_DIR}/src/libpocketsphinx/.libs/libpocketsphinx.a)
    INCLUDE_DIRECTORIES(${POCKETSPHINX_SOURCE_DIR}/include/)
    add_definitions( -DMODELDIR="${POCKETSPHINX_BINARY_DIR}/model")
    SET(DEPENDENCIES ${DEPENDENCIES} pocketsphinx)
endif ()
SET(LIBS ${LIBS} ${POCKETSPHINX_LIBRARIES})

FIND_PACKAGE(PortAudio)
if (${PORTAUDIO_FOUND})
    INCLUDE_DIRECTORIES(${PORTAUDIO_INCLUDE_DIRS})
    SET(DEPENDENCIES ${DEPENDENCIES} PortAudio)
else ()
    ExternalProject_Add(
        PortAudio
        SVN_REPOSITORY      "https://subversion.assembla.com/svn/portaudio/portaudio/trunk/"
        SVN_TRUST_CERT      1
        SOURCE_DIR          ${CMAKE_CURRENT_SOURCE_DIR}/lib/PortAudio
        CONFIGURE_COMMAND   ${CMAKE_CURRENT_SOURCE_DIR}/lib/PortAudio/configure --prefix=<INSTALL_DIR>
        BUILD_COMMAND       make
        UPDATE_COMMAND      ""
        INSTALL_COMMAND     make install
        BUILD_IN_SOURCE     ON
        LOG_DOWNLOAD        ON
        LOG_UPDATE          ON
        LOG_CONFIGURE       ON
        LOG_BUILD           ON
        LOG_TEST            ON
        LOG_INSTALL         ON
    )
    ExternalProject_Get_Property(PortAudio SOURCE_DIR)
    ExternalProject_Get_Property(PortAudio BINARY_DIR)
    SET(PORTAUDIO_SOURCE_DIR ${SOURCE_DIR})
    SET(PORTAUDIO_BINARY_DIR ${BINARY_DIR})
    SET(PORTAUDIO_LIBRARIES ${PORTAUDIO_BINARY_DIR}/lib/.libs/libportaudio.dylib)
    INCLUDE_DIRECTORIES(${PORTAUDIO_SOURCE_DIR})
    SET(DEPENDENCIES ${DEPENDENCIES} PortAudio)
endif ()
SET(LIBS ${LIBS} ${PORTAUDIO_LIBRARIES})

FIND_PACKAGE(LibSndFile)
if(${LIBSNDFILE_FOUND})
    INCLUDE_DIRECTORIES(${LIBSNDFILE_INCLUDE_DIRS})
    SET(DEPENDENCIES ${DEPENDENCIES} LibSndFile)
else ()
    ExternalProject_Add(
        LibSndFile
        URL                 "http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.26.tar.gz"
        CONFIGURE_COMMAND   ${CMAKE_CURRENT_SOURCE_DIR}/lib/LibSndFile/configure --prefix=<INSTALL_DIR> --disable-external-libs
        BUILD_COMMAND       ${MAKE}
        SOURCE_DIR          ${CMAKE_CURRENT_SOURCE_DIR}/lib/LibSndFile
        UPDATE_COMMAND      ""
        INSTALL_COMMAND     make install
        BUILD_IN_SOURCE     ON
        LOG_DOWNLOAD        ON
        LOG_UPDATE          ON
        LOG_CONFIGURE       ON
        LOG_BUILD           ON
        LOG_TEST            ON
        LOG_INSTALL         ON
    )
    ExternalProject_Get_Property(LibSndFile SOURCE_DIR)
    ExternalProject_Get_Property(LibSndFile BINARY_DIR)
    SET(LIBSNDFILE_SOURCE_DIR ${SOURCE_DIR}/src)
    SET(LIBSNDFILE_BINARY_DIR ${BINARY_DIR})
    SET(LIBSNDFILE_LIBRARIES ${LIBSNDFILE_BINARY_DIR}/src/.libs/libsndfile.a)
    INCLUDE_DIRECTORIES(${LIBSNDFILE_SOURCE_DIR})
    SET(DEPENDENCIES ${DEPENDENCIES} LibSndFile)
endif ()
SET(LIBS ${LIBS} ${LIBSNDFILE_LIBRARIES})

# TODO: create FindTritium.cmake
ExternalProject_Add(
    tritium
    GIT_REPOSITORY  "https://github.com/syb0rg/tritium.git"
    GIT_TAG         "f6cd6a750945373b48c05c0f2d682e478e6a719d"
    SOURCE_DIR      ${CMAKE_CURRENT_SOURCE_DIR}/lib/tritium
    UPDATE_COMMAND  ""
    INSTALL_COMMAND make install
    BUILD_IN_SOURCE ON
    LOG_DOWNLOAD    ON
    LOG_UPDATE      ON
    LOG_CONFIGURE   ON
    LOG_BUILD       ON
    LOG_TEST        ON
    LOG_INSTALL     ON
)
ExternalProject_Get_Property(tritium SOURCE_DIR)
ExternalProject_Get_Property(tritium BINARY_DIR)
SET(TRITIUM_SOURCE_DIR ${SOURCE_DIR})
SET(TRITIUM_BINARY_DIR ${BINARY_DIR})
INCLUDE_DIRECTORIES(${TRITIUM_SOURCE_DIR}/include)
SET(TRITIUM_LIBRARIES ${TRITIUM_BINARY_DIR}/libtritium.a)
SET(LIBS ${LIBS} ${TRITIUM_LIBRARIES})
SET(DEPENDENCIES ${DEPENDENCIES} tritium)

INCLUDE_DIRECTORIES(include)
ADD_SUBDIRECTORY(src)

ADD_EXECUTABLE(${PROJECT_NAME}
        $<TARGET_OBJECTS:audio>
        $<TARGET_OBJECTS:util>
        $<TARGET_OBJECTS:main>
        )
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIBS})
ADD_DEPENDENCIES(${PROJECT_NAME} ${DEPENDENCIES})

执行时,它给我以下输出:
$ cmake ..
-- The C compiler identification is AppleClang 7.3.0.7030029
-- The CXX compiler identification is AppleClang 7.3.0.7030029
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Doxygen: /usr/local/bin/doxygen (found version "1.8.11") 
-- Found sphinxbase: /usr/local/lib/libsphinxbase.dylib  
-- Found pocketsphinx: /usr/local/lib/libpocketsphinx.dylib  
-- Found Portaudio: /usr/local/lib/libportaudio.dylib
-- Found LibSndFile: /usr/local/lib/libsndfile.dylib  
-- Configuring done
CMake Error at CMakeLists.txt:189 (ADD_DEPENDENCIES):
  The dependency target "LibSndFile" of target "Khronos" does not exist.


CMake Error at CMakeLists.txt:189 (ADD_DEPENDENCIES):
  The dependency target "PortAudio" of target "Khronos" does not exist.


CMake Error at CMakeLists.txt:189 (ADD_DEPENDENCIES):
  The dependency target "pocketsphinx" of target "Khronos" does not exist.


CMake Error at CMakeLists.txt:189 (ADD_DEPENDENCIES):
  The dependency target "sphinxbase" of target "Khronos" does not exist.


-- Generating done
-- Build files have been written to: /Users/syb0rg/Dropbox/Development/Khronos/Khronos/build

对这些错误进行研究并没有找到任何结果。我的脚本出现了什么问题导致这些错误?我应该做些什么来修复它们?

1个回答

3

命令

find_package(<libname>)

不定义CMake的<libname>目标。

您需要移动附加内容。

SET(DEPENDENCIES ${DEPENDENCIES} ...)

为了对应else子句,需要使用ExternalProject_Add定义合适的目标。

这个不行,当我尝试构建我的程序时,它会尝试构建依赖于其他(未构建)部分的部分,导致错误。 - syb0rg
[mcve]请。您的CMakeLists.txt相对较长,有重复部分,并且某些部分失败了。不清楚哪个部分失败了。 - Tsyvarev
这是一个完整且可验证的示例。我刚刚编辑了一些无关的脚本部分,以帮助将其最小化。我不确定您所说的重复部分是什么意思,ExternalProjects可能看起来相同,但它们都是自己独立的组件。 - syb0rg
我指的是相似的部分。是的,“重复”的词语不适用于此,对此我很抱歉。当您从类似的块构建代码时,通常只需要详细说明第一个块,其他块可以简单地复制(并进行适当的替换)。您写道“它尝试构建依赖于其他(未构建)部分的部分,导致错误。”-哪个确切部分无法构建,以及它依赖于哪个(未构建)部分? - Tsyvarev
2
它失败的问题似乎在别处,而这个答案似乎已经帮我解决了这个最初的问题。 - syb0rg
1
我在遇到这个错误时感到困惑,后来才意识到依赖目标没有被构建,因为我忘记了在我的根CMakeLists.txt中添加add_subdirectory(my_dependency_dir) - arthropod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接