【问题标题】:cmake external projects command seems to ignore INSTALL_DIRcmake external projects 命令似乎忽略了 INSTALL_DIR
【发布时间】:2015-06-25 17:57:49
【问题描述】:

首先,我对 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 的目的是什么?

【问题讨论】:

    标签: cmake external-project


    【解决方案1】:

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

    cmake 2.8 doc about external project

    安装步骤

    INSTALL_DIR 在调用项目的下面 二进制目录。使用 INSTALL_DIR 指定不同的位置。 注意除了设置INSTALL_DIR,还得通过 -DCMAKE_INSTALL_PREFIX 或 --prefix 到 CMake 或配置命令。它不会在配置步骤中自动使用,因为不是全部 项目遵循此约定。

    # [INSTALL_DIR dir]

    你可以在你的configure命令中参考安装目录,对于 示例:

    CONFIGURE_COMMAND SOURCE_DIR/configure --prefix=INSTALL_DIR
    
     # [INSTALL_COMMAND cmd...]
    

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

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

    【讨论】:

    • 我现在正在使用 CMAKE_ARGS 为外部项目设置 CMAKE_INSTALL_PREFIX,不需要使用 INSTALL_DIR。但是,我将此标记为指向相关文档的正确答案。
    • 这可能是因为我使用的是较新的 CMake 版本(3.14-rc1),但它应该放在尖括号中:--prefix=<INSTALL_DIR>
    猜你喜欢
    • 2016-03-16
    • 2021-06-06
    • 2021-10-28
    • 2016-09-30
    • 2014-02-03
    • 2012-03-11
    • 2013-09-07
    • 2016-08-12
    • 1970-01-01
    相关资源
    最近更新 更多