CMake ExternalProject_Add设置安装前缀后仍用默认目录解决方法
问题原因
你看到的固定路径build/cgal_dependencies-prefix是ExternalProject_Add为外部项目默认生成的工作根目录,用于存放下载的压缩包、解压源码、构建临时文件、流程标记文件,和你配置的CMAKE_INSTALL_PREFIX(外部项目安装路径)是完全独立的两个配置项,所以修改安装路径参数不会改变这个工作目录的位置。
你当前的代码还有两个明显问题:
cmake_minimum_required命令必须放在project命令之前,否则会出现缓存变量加载、项目初始化异常- 你在
CMAKE_ARGS里传入的CMAKE_INSTALL_PREFIX参数是供外部项目自身的CMake构建流程使用的,但你已经把CONFIGURE_COMMAND/BUILD_COMMAND/INSTALL_COMMAND全部设为空,既跳过了外部项目的配置构建流程,也没有定义文件拷贝逻辑,压缩包下载解压后不会自动部署到你指定的安装目录。
修正方案
1. 修改外部项目工作/下载目录
通过ExternalProject_Add的专属参数指定路径:
PREFIX <path>:替换默认的xxx-prefix工作根目录DOWNLOAD_DIR <path>:可选,单独指定压缩包的下载存放位置,不设置的话默认会放到PREFIX下的src子目录
2. 配置免编译包的安装逻辑
你下载的是预编译好的CGAL依赖二进制包,不需要cmake配置和编译流程,需要手动写INSTALL_COMMAND把解压后的文件拷贝到目标安装路径。
修正后的完整代码
# 注意:cmake_minimum_required 必须放在project命令前 cmake_minimum_required(VERSION 3.19) project(superbuild LANGUAGES CXX) set( CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE STRING "Final install location." ) ExternalProject_Add(cgal_dependencies # 下载地址 URL https://github.com/CGAL/cgal/releases/download/v5.4.1/CGAL-5.4.1-win64-auxiliary-libraries-gmp-mpfr.zip # 自定义工作根目录,替换默认的build/cgal_dependencies-prefix PREFIX "${CMAKE_BINARY_DIR}/third_party/cgal_deps_work" # 可选:单独指定zip包下载存放目录 # DOWNLOAD_DIR "${CMAKE_BINARY_DIR}/downloads" # 免编译包不需要配置、构建步骤 CONFIGURE_COMMAND "" BUILD_COMMAND "" # 安装逻辑:把解压后的所有文件拷贝到安装目录 INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory "<SOURCE_DIR>" "${CMAKE_INSTALL_PREFIX}" )
参数说明
<SOURCE_DIR>是ExternalProject内置变量,指向压缩包解压后的根目录,不需要手动替换- 如果你不需要自定义整个工作目录,只是不想让下载的文件散落在默认prefix目录,只加
DOWNLOAD_DIR参数指定下载路径即可 - 如果你就是想把默认的
xxx-prefix目录挪位置,只需要设置PREFIX参数为你想要的绝对路径就可以生效
内容的提问来源于stack exchange,提问作者PetrasVestartasEPFL
相关产品推荐
相关产品推荐

