我在一个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
)
但我遇到了以下错误:
有什么建议吗?CMake Error at CMakeLists.txt:197 (install): install TARGETS given target "/Users/syb0rg/Dropbox/Development/Khronos/Khronos/lib/sphinxbase/src/libsphinxbase/.libs/libsphinxbase.a" which does not exist in this directory.
./autogen.sh --prefix=${sphinxbase_DESTDIR}/${CMAKE_INSTALL_PREFIX}
而不覆盖INSTALL_COMMAND
的情况下,CMAKE_INSTALL_PREFIX
+DESTDIR
之间有什么区别?对于这种情况,DESTDIR
相对于配置前缀是不方便的。 - HunterZ--prefix
不仅仅是指在make install
时需要复制所有必要文件的目录:1. 对于类似于/
、/usr/local
、/opt
的系统范围前缀,某些文件可能会被安装 在前缀外。2. 它可以是存储在一个项目文件中的绝对路径,用于引用其他项目文件。因为(2),最好不要使用“虚假”的--prefix
- 它会使项目混乱。相反,DESTDIR
从未在项目文件中使用,并且保证所有项目文件将被安装在给定目录下。 - TsyvarevDESTDIR=...
语义。或者甚至是自动工具特定的方法。可能一些在Windows上工作的CMake生成器也有类似的语义。但是,“Linux方式”,“Windows方式”甚至“跨平台方式”……我非常不确定它们是否存在。“我可以理解为什么你给出了一个Linux答案,因为OP显然正在使用.a文件”——不是因为.a
而是因为autogen.sh
用于配置项目。据我所知,它是自动工具的一部分,只能在Linux上工作。 - Tsyvarevinstall(DIRECTORY ... USE_SOURCE_PERMISSIONS ...)
以保留该目录中二进制文件的可执行权限(如果您构建了二进制文件)。 - xealitsinstall(DIRECTORY)
调用中添加了USE_SOURCE_PERMISSIONS。 - Tsyvarev