CMake构建Flutter Android插件报错:URL条目含无效路径
问题:CMake构建Flutter Android插件时下载Zip包报错 "At least one entry of URL is a path (invalid in a list)"
问题详情
为自研Flutter插件配置CMake时,编写了从GitHub仓库下载Zip包的代码,Windows平台构建正常,但Android平台构建失败,报错:At least one entry of URL is a path (invalid in a list)。
相关CMake代码片段
# Download the zipped folder of dart-sdk-api from the dependencies repo set(dart_sdk_api_zip_url "https://github.com/Haidar0096/image_magick_ffi_deps/raw/master/dart_sdk_api.zip") message(STATUS "Downloading dart-sdk-api from ${dart_sdk_api_zip_url}") FetchContent_Declare( dart_sdk_api URL ${dart_sdk_api_zip_url} DOWNLOAD_EXTRACT_TIMESTAMP TRUE ) FetchContent_MakeAvailable(dart_sdk_api) # Include the include folder of dart_sdk_api from the downloaded zip include_directories(${dart_sdk_api_SOURCE_DIR}/include) # Create a target from the sources of the downloaded zip and link it to the executable file(GLOB_RECURSE DART_SDK_API_SOURCES "${dart_sdk_api_SOURCE_DIR}/src/*.c") add_library(dart_sdk_api STATIC ${DART_SDK_API_SOURCES}) target_link_libraries(image_magick_ffi dart_sdk_api)
Android构建错误日志
[ ] Successfully started process 'command 'C:\Users\haidar\AppData\Local\Android\Sdk\cmake\3.18.1\bin\cmake.exe'' [ ] C/C++: debug|arm64-v8a :CMake Error at C:/Users/haidar/AppData/Local/Android/Sdk/cmake/3.18.1/share/cmake-3.18/Modules/ExternalProject.cmake:2480 (message): [ ] C/C++: debug|arm64-v8a : At least one entry of URL is a path (invalid in a list) [ ] C/C++: debug|arm64-v8a :Call Stack (most recent call first): [ ] C/C++: debug|arm64-v8a : C:/Users/haidar/AppData/Local/Android/Sdk/cmake/3.18.1/share/cmake-3.18/Modules/ExternalProject.cmake:3228 (_ep_add_download_command) [ ] C/C++: debug|arm64-v8a : CMakeLists.txt:13 (ExternalProject_Add) [ ] C/C++: debug|arm64-v8a :-- Configuring incomplete, errors occurred! [ ] C/C++: debug|arm64-v8a :See also "D:/dev_haidar/flutter/image_magick_ffi/android/.cxx/Debug/42552b6e/arm64-v8a/_deps/dart_sdk_api-subbuild/CMakeFiles/CMakeOutput.log".
错误原因
报错源于Android SDK自带的CMake版本(3.18.1)过旧,在Android交叉编译场景下,旧版本CMake对FetchContent_Declare的URL参数解析存在缺陷,会误将远程URL识别为本地路径,从而触发该错误。
解决方法
方法1:升级Android SDK中的CMake版本
打开Android Studio,进入SDK Manager -> SDK Tools,找到CMake选项,选择更新到3.21及以上版本(如3.22.1),重新构建项目即可。新版本CMake优化了FetchContent的URL处理逻辑,能正确识别远程资源。
方法2:添加URL_HASH参数增强兼容性
在FetchContent_Declare中加入URL_HASH参数,指定下载文件的SHA256哈希值,帮助旧版本CMake明确这是远程资源。示例代码:
FetchContent_Declare( dart_sdk_api URL ${dart_sdk_api_zip_url} URL_SHA256 替换为dart_sdk_api.zip的SHA256哈希值 DOWNLOAD_EXTRACT_TIMESTAMP TRUE )
可通过以下命令获取哈希值:
- Windows:
certutil -hashfile dart_sdk_api.zip SHA256 - Linux/macOS:
shasum -a 256 dart_sdk_api.zip
方法3:改用ExternalProject_Add手动配置(兼容旧CMake)
若无法升级CMake,可直接使用ExternalProject_Add替代FetchContent,手动配置下载逻辑:
include(ExternalProject) ExternalProject_Add( dart_sdk_api URL ${dart_sdk_api_zip_url} DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/dart_sdk_api-src CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" DOWNLOAD_EXTRACT_TIMESTAMP TRUE ) # 确保依赖顺序 add_dependencies(image_magick_ffi dart_sdk_api) # 配置头文件和源码 include_directories(${CMAKE_CURRENT_BINARY_DIR}/_deps/dart_sdk_api-src/include) file(GLOB_RECURSE DART_SDK_API_SOURCES "${CMAKE_CURRENT_BINARY_DIR}/_deps/dart_sdk_api-src/src/*.c") # 构建静态库并链接 add_library(dart_sdk_api STATIC ${DART_SDK_API_SOURCES}) add_dependencies(dart_sdk_api dart_sdk_api) target_link_libraries(image_magick_ffi dart_sdk_api)
内容的提问来源于stack exchange,提问作者Haidar
相关产品推荐
相关产品推荐

