Build 使用CMake安装外部项目

Build 使用CMake安装外部项目,build,cmake,installation,build-process,external-project,Build,Cmake,Installation,Build Process,External Project,我的CMakeLists.txt文件中有以下代码: FIND_PACKAGE(sphinxbase) if (${SPHINXBASE_FOUND}) INCLUDE_DIRECTORIES(${SPHINXBASE_INCLUDE_DIR}/sphinxbase/) else () ExternalProject_Add( sphinxbase GIT_REPOSITORY "https://github.com/cmusphinx/s

我的
CMakeLists.txt文件中有以下代码:

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     ""
        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})
除了我正在尝试安装的目标之外,我将如何安装这个ExternalProject?现在我试着这样做:

install(TARGETS ${LIBS}
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
        OPTIONAL
        )

install(TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION bin
        )
但我遇到了以下错误:

有什么建议吗?

命令流
install(TARGETS)
安装目标,这些目标是使用
add\u executable
add\u library
命令创建的。对于安装具体文件,您需要使用命令流
install(files)

您可以按原样安装子项目,而不是从子项目的生成目录安装所选文件。你可以用

make DESTDIR=<...> install
请注意,根目录用作
目标
。这是因为
sphinxbase_DESTDIR
目录下的文件已根据
CMAKE_INSTALL_PREFIX
定位,并作为
--PREFIX
选项传递到
configure.sh
autogen.sh

如果您知道,子项目仅在安装前缀(由
--prefix
给出)下安装其文件,则可以使主项目安装更便于打包:

因为现在相对路径用于
目的地
选项,所以项目将正确支持打包。例如,
make DESTDIR=install
也适用于主项目



请注意,即使将
ExternalProject\u Add
用于构建CMake子项目,主项目也看不到在此子项目中创建的目标。

CMake\u INSTALL\u PREFIX
+
DESTDIR
dance与仅使用
/autogen.sh--PREFIX=${sphinxbase\u DESTDIR}之间有什么区别/${CMAKE_INSTALL_PREFIX}
并且不重写
安装_命令
?对于这个用例,不方便的是
DESTDIR
是相对于配置前缀的。@HunterZ:在autotools中,
--prefix
不仅仅是一个目录,所有需要的文件都将在
make INSTALL
:1下复制。在系统范围前缀的情况下,比如
//code>,
/usr/local
/opt
,某些文件可能安装在前缀之外。2.它可能是存储在一个项目文件中的绝对路径,用于引用另一个项目文件。由于(2),最好不要使用“假”
--prefix
-这会混淆项目。相反,DESTDIR
在项目的文件中从不使用,并且有一个保证,所有项目的文件都将安装在给定的目录下。我认为这个答案可能只适用于Linux;我可以理解为什么您给出Linux答案,因为OP显然使用的是.a文件s、 我只是想提一下这一点,以防其他人正在寻找Windows的答案。我感觉有一个更跨平台的选项可能同时适用于这两个选项,但不幸的是,我不确定它是什么。@jrh:更准确地说,这是GNU的Make specific方法,它支持
DESTDIR=…
semantic。甚至支持特定于自动工具的方法一些。可能一些在Windows上工作的CMake生成器也有类似的语义。但是“Linux方式”、“Windows方式”甚至“跨平台方式”…我非常不确定它们是否存在。“我明白你为什么给出Linux答案,因为OP显然是在处理.a文件”-不,这不是因为
。a
,而是因为
autogen.sh
用于配置项目。据我所知,它是autotools的一部分,仅在Linux上工作。不幸的是,这个主题在网上的覆盖率似乎很低;这意味着有办法实现外部项目的目标,但没有“项目”过载(我希望他们不是指“安装外部项目中的每个独立构建文件”;其他页面提到使用
-DCMAKE\u install\u PREFIX:PATH=
,省略install\u命令将起作用(没有骰子)。我想这是可能的。
make DESTDIR=<...> install
# It is better to use binary directory for download or build 3d-party project 
set(sphinxbase_SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib/sphinxbase)
# This will be used as DESTDIR on subproject's `make install`.
set(sphinxbase_DESTDIR ${CMAKE_CURRENT_BINARY_DIR}/lib/sphinxbase_install)

ExternalProject_Add(
    sphinxbase
    GIT_REPOSITORY      "https://github.com/cmusphinx/sphinxbase.git"
    GIT_TAG             "e34b1c632392276101ed16e8a05862e43f038a7c"
    SOURCE_DIR          ${sphinxbase_SOURCE_DIR}
    # Specify installation prefix for configure.sh (autogen.sh).
    CONFIGURE_COMMAND   ./autogen.sh --prefix=${CMAKE_INSTALL_PREFIX}
    BUILD_COMMAND       ${MAKE}
    UPDATE_COMMAND      ""
    # Fake installation: copy installed files into DESTDIR.
    INSTALL_COMMAND     make DESTDIR=${sphinxbase_DESTDIR} install
    ...
)
# Actually install subproject.
install(DIRECTORY ${sphinxbase_DESTDIR}/ DESTINATION "/")
install(DIRECTORY ${sphinxbase_DESTDIR}/${CMAKE_INSTALL_PREFIX}/ DESTINATION ".")