12

首先,我对 cmake 比较陌生。我正在尝试使用 cmake 构建具有单个外部依赖项的项目。我将外部项目的 INSTALL_DIR 指定为 CMAKE_INSTALL_PREFIX,因此它安装到与父项目相同的位置。但是当我运行 make 时,它​​会忽略它并尝试安装到 /usr/local/lib。

这是我的 CMakeList.txt:

cmake_minimum_required( VERSION 2.8 )
include( ExternalProject )
project( capture )
add_library( capture SHARED capture.cc )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )

ExternalProject_Add( proj_exceptions 
    GIT_REPOSITORY /home/user/workspace/exceptions 
    INSTALL_DIR ${CMAKE_INSTALL_PREFIX} 
)

add_library( exceptions SHARED IMPORTED )
set_property( TARGET exceptions 
    PROPERTY IMPORTED_LOCATION ${CMAKE_INSTALL_PREFIX}/lib/libexceptions.so 
)
add_dependencies( exceptions proj_exceptions )
include_directories( ${CMAKE_INSTALL_PREFIX}/include )
target_link_libraries( capture exceptions )
install( TARGETS capture DESTINATION lib )
install( FILES capture.h DESTINATION include )

外部项目的 CMakeLists.txt 如下所示:

cmake_minimum_required( VERSION 2.8 )
project( exceptions )
add_library( exceptions SHARED exceptions.cc )
install( TARGETS exceptions DESTINATION lib )
install( FILES exceptions.hh DESTINATION include )

它可以很好地克隆和构建外部项目,但是在安装步骤中会卡住:

Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libexceptions.so
CMake Error at cmake_install.cmake:42 (file):
  file INSTALL cannot copy file
  "/home/user/workspace/capture/build/proj_exceptions-prefix/src/proj_exceptions-build/libexceptions.so"
  to "/usr/local/lib/libexceptions.so".
Makefile:66: recipe for target 'install' failed

如您所见,安装配置为空。查看为外部项目生成的配置,我在 cmake_install.cmake 中找到了这个:

if(NOT DEFINED CMAKE_INSTALL_PREFIX)
  set(CMAKE_INSTALL_PREFIX "/usr/local")
endif()

因此,似乎将 INSTALL_DIR 传递给 ExternalProject_Add 并没有设置安装前缀。安装步骤成功,如果我改为使用:

ExternalProject_Add( proj_exceptions 
    GIT_REPOSITORY /home/djones/workspace/exceptions 
    CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}" 
)     

那么 INSTALL_DIR 的目的是什么?

4

1 回答 1

6

就 INSTALL_DIR 而言,您是对的,但您可能错过了一些步骤。

根据关于外部项目的 cmake 2.8 文档

安装步骤

INSTALL_DIR 位于调用项目的二进制目录下。使用 INSTALL_DIR 指定不同的位置。请注意,除了设置 INSTALL_DIR 之外,您还必须将 -DCMAKE_INSTALL_PREFIX 或 --prefix 传递给 CMake 或 configure 命令。它不会在配置步骤中自动使用,因为并非所有项目都遵循此约定。

# [INSTALL_DIR dir]

您可以在您的配置命令中引用安装目录,例如:

CONFIGURE_COMMAND SOURCE_DIR/configure --prefix=INSTALL_DIR

 # [INSTALL_COMMAND cmd...]

基于 CMake 的项目使用“cmake--build”来构建安装目标。其他项目使用“make install”。使用 INSTALL_COMMAND 自定义安装步骤。使用 INSTALL_COMMAND “” 省略安装步骤。安装命令执行时工作目录设置为 .

所以尝试更新你的 cmake 命令,或者使用自定义的 INSTALL_COMMAND 功能。

于 2015-09-09T07:14:00.803 回答