【发布时间】:2021-01-08 21:29:26
【问题描述】:
我有一个简单的 CMake 项目,它使用 ExternalProject_Add 来配置和编译 ffmpeg。 CMakeLists.txt 如下所示:
cmake_minimum_required(VERSION 3.2)
project(FFMpeg)
include(ExternalProject)
set(PRIVATE_LIBRARY_PATH "home/user/local/lib")
set(PRIVATE_PKG_CONFIG "home/user/local/pkgconfig")
set(FFMPEG_CONFIGURE_COMMAND echo)
if(NOT (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/FFMpeg/config.h))
set(FFMPEG_CONFIGURE_COMMAND ./configure)
set(FFMPEG_DEBUG_CONFIGURE_ARGS "--enable-x86asm --disable-doc --extra-libs=-lpthread --extra-libs=-ldl --enable-shared --enable-static --disable-avx512 --disable-optimizations --extra-cflags=-g3 --extra-cflags=-fno-omit-frame-pointer --enable-debug=3 --extra-cflags=-fno-inline --disable-stripping")
endif()
ExternalProject_Add(ffmpeg
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ffmpeg
CONFIGURE_COMMAND export LD_LIBRARY_PATH=${PRIVATE_LIBRARY_PATH} PKG_CONFIG_PATH=${PRIVATE_PKG_CONFIG}/usr/lib/pkgconfig && ${FFMPEG_CONFIGURE_COMMAND} ${FFMPEG_DEBUG_CONFIGURE_XMA_ARGS}
BUILD_COMMAND export LD_LIBRARY_PATH=${PRIVATE_LIBRARY_PATH} PKG_CONFIG_PATH=${PRIVATE_PKG_CONFIG}/usr/lib/pkgconfig && make V=1
INSTALL_COMMAND make install
INSTALL_DIR ""
BUILD_IN_SOURCE 1
BUILD_ALWAYS 1)
但是当执行 ExternalProject_Add 的 CONFIGURE_COMMAND 时,命令在扩展字符串 FFMPEG_DEBUG_CONFIGURE_ARGS 之间添加双引号,因此 ffmpeg 配置脚本会忽略参数:
./configure "--enable-x86asm --disable-doc --extra-libs=-lpthread --extra-libs=-ldl --enable-shared --enable-static --disable-avx512 --disable-optimizations --extra-cflags=-g3 --extra-cflags=-fno-omit-frame-pointer --enable-debug=3 --extra-cflags=-fno-inline --disable-stripping"
如何更改 CONFIGURE_COMMAND 命令行以删除双引号以允许 FFMpeg 配置脚本正确识别参数?
【问题讨论】:
-
好吧,用引号可以确保你有一个包含所有命令行参数的 1 个元素的“列表”。由于参数中的空格会导致命令行将其解释为多个参数,因此 CMake 需要插入引号。删除引号,您将得到一个包含 13 个元素的列表,每个元素都包含一个参数。 (通过循环打印列表元素可以清楚地看到这一点:
foreach(_TEMP IN LISTS FFMPEG_DEBUG_CONFIGURE_ARGS) message(STATUS "item: ${_TEMP}") endforeach())