【问题标题】:Flutter - problem with adding native dependency on WindowsFlutter - 在 Windows 上添加本机依赖的问题
【发布时间】:2022-01-21 11:06:41
【问题描述】:

我正在尝试使用本机 C++ 依赖项构建 Flutter,但每次我尝试添加 CMake 子项目时,由于创建目录时出现问题,它都会失败。这可能很简单,但很难找到任何关于如何为 Windows 平台添加依赖项的指南,所以我正在即兴创作(很多)。


Flutter Doctor 总结:

[√] Flutter (Channel stable, 2.5.3, on Microsoft Windows [Version 10.0.22000.376], locale pl-PL)
[√] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
[√] Chrome - develop for the web
[√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.11.6)
[√] Android Studio (version 2020.3)
[√] IntelliJ IDEA Ultimate Edition (version 2021.2)
[√] VS Code (version 1.63.0)
[√] Connected device (3 available)

重现步骤:

  1. 创建一个支持 Windows 平台的新 Flutter 项目。

  2. 将库(例如DirectXText)复制到项目根文件夹中。

  3. 通过添加子目录 (add_subdirectory(../DirectXTex "${CMAKE_BINARY_DIR}/${PROJECT_NAME}_directxtex")) 在[project]\windows\CMakeLists.txt 中添加库:

cmake_minimum_required(VERSION 3.15)
project(stackoverflow_windows_question LANGUAGES CXX)

set(BINARY_NAME "stackoverflow_windows_question")

cmake_policy(SET CMP0063 NEW)

set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")

# Configure build options.
get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(IS_MULTICONFIG)
  set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
    CACHE STRING "" FORCE)
else()
  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE "Debug" CACHE
      STRING "Flutter build mode" FORCE)
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
      "Debug" "Profile" "Release")
  endif()
endif()

set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")

# Use Unicode for all projects.
add_definitions(-DUNICODE -D_UNICODE)

# Compilation settings that should be applied to most targets.
function(APPLY_STANDARD_SETTINGS TARGET)
  target_compile_features(${TARGET} PUBLIC cxx_std_17)
  target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
  target_compile_options(${TARGET} PRIVATE /EHsc)
  target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
  target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>")
endfunction()

set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")

# Flutter library and tool build rules.
add_subdirectory(${FLUTTER_MANAGED_DIR})

# Application build
add_subdirectory("runner")

# Generated plugin build rules, which manage building the plugins and adding
# them to the application.
include(flutter/generated_plugins.cmake)

add_subdirectory(../DirectXTex "${CMAKE_BINARY_DIR}/${PROJECT_NAME}_directxtex") # NEW LINE

# === Installation ===
# Support files are copied into place next to the executable, so that it can
# run in place. This is done instead of making a separate bundle (as on Linux)
# so that building and running from within Visual Studio will work.
set(BUILD_BUNDLE_DIR "$<TARGET_FILE_DIR:${BINARY_NAME}>")
# Make the "install" step default, as it's required to run.
set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
endif()

set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")

install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
  COMPONENT Runtime)

install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
  COMPONENT Runtime)

install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
  COMPONENT Runtime)

if(PLUGIN_BUNDLED_LIBRARIES)
  install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
    DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
    COMPONENT Runtime)
endif()

# Fully re-copy the assets directory on each build to avoid having stale files
# from a previous install.
set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
install(CODE "
  file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
  " COMPONENT Runtime)
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
  DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)

# Install the AOT library on non-Debug builds only.
install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
  CONFIGURATIONS Profile;Release
  COMPONENT Runtime)
  1. 尝试以详细模式构建它:
flutter build windows -v
  1. 等待构建失败:
[  +78 ms] PostBuildEvent:
[        ]   setlocal
[        ]   "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -DBUILD_TYPE=Release -P cmake_install.cmake
[        ]   if %errorlevel% neq 0 goto :cmEnd
[        ]   :cmEnd
[        ]   endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
[        ]   :cmErrorLevel
[        ]   exit /b %1
[        ]   :cmDone
[        ]   if %errorlevel% neq 0 goto :VCEnd
[        ]   :VCEnd
[  +83 ms]   -- Install configuration: "Release"
[   +1 ms]   CMake Error at stackoverflow_windows_question_directxtex/cmake_install.cmake:41 (file):
[        ]     file cannot create directory:
[        ]     C:/Users/jbili/Documents/Flutter-Projects/stackoverflow_windows_question/build/windows/$<TARGET_FILE_DIR:stackoverflow_windows_question>/lib.
[        ]     Maybe need administrative privileges.
[        ]   Call Stack (most recent call first):
[        ]     cmake_install.cmake:47 (include)
[   +7 ms] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: Polecenie „setlocal [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[   +1 ms] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -DBUILD_TYPE=Release -P
cmake_install.cmake [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: :cmEnd [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: :cmErrorLevel [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: exit /b %1 [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: :cmDone [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: :VCEnd” zostało zakończone przez kod 1. [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] Kompilowanie projektu „C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj” wykonane (domyślne elementy docelowe) — NIEPOWODZENIE.
[        ] Kompilacja NIE POWIODŁA SIĘ.
[        ] „C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj” (domyślny element docelowy) (1)->
[        ] (element docelowy PostBuildEvent) ->
[        ]   C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: Polecenie „setlocal [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -DBUILD_TYPE=Release -P
cmake_install.cmake [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: :cmEnd [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: :cmErrorLevel [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: exit /b %1 [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: :cmDone [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: :VCEnd” zostało zakończone przez kod 1. [C:\Users\jbili\Documents\Flutter-Projects\stackoverflow_windows_question\build\windows\INSTALL.vcxproj]
[        ]     Ostrzeżenia: 0
[        ]     Liczba błędów: 1
[        ] Czas, który upłynął: 00:00:41.72
[  +12 ms] Building Windows application... (completed in 44,1s)
[        ] "flutter windows" took 44 278ms.
[   +2 ms] Build process failed.
[        ] 
           #0      throwToolExit (package:flutter_tools/src/base/common.dart:10:3)
           #1      _runBuild (package:flutter_tools/src/windows/build_windows.dart:299:5)
           <asynchronous suspension>
           #2      buildWindows (package:flutter_tools/src/windows/build_windows.dart:78:5)
           <asynchronous suspension>
           #3      BuildWindowsCommand.runCommand (package:flutter_tools/src/commands/build_windows.dart:55:5)
           <asynchronous suspension>
           #4      FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1125:27)
           <asynchronous suspension>
           #5      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
           <asynchronous suspension>
           #6      CommandRunner.runCommand (package:args/command_runner.dart:209:13)
           <asynchronous suspension>
           #7      FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:288:9)
           <asynchronous suspension>
           #8      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
           <asynchronous suspension>
           #9      FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:236:5)
           <asynchronous suspension>
           #10     run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:62:9)
           <asynchronous suspension>
           #11     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
           <asynchronous suspension>
           #12     main (package:flutter_tools/executable.dart:92:3)
           <asynchronous suspension>
           
           
[  +69 ms] ensureAnalyticsSent: 68ms
[        ] Running shutdown hooks
[        ] Shutdown hooks complete
[        ] exiting with code 1

如您所见,它失败了,因为它无法创建目录C:/Users/jbili/Documents/Flutter-Projects/stackoverflow_windows_question/build/windows/$&lt;TARGET_FILE_DIR:stackoverflow_windows_question&gt;/lib,因为目录路径看起来不正确。我认为$&lt;TARGET_FILE_DIR:stackoverflow_windows_question&gt; 在某些时候没有被 CMake 转换,但我不知道为什么。

你能帮我解决这个问题吗?

【问题讨论】:

    标签: c++ windows flutter dart cmake


    【解决方案1】:

    我不确定,但是您是否尝试过使用管理员权限运行脚本,这可能会解决您的问题,因为错误提示“可能需要管理员权限。”

    【讨论】:

    • 是的,我尝试使用提升的权限运行这个项目,但没有帮助。我想我错过了CMakeLists.txt 中的一些“Flutter Magic”。我不知道我到底错过了什么,因为在 Flutter 中添加桌面库是无证的。
    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 2013-03-21
    • 2019-06-26
    • 2015-05-28
    • 2019-11-14
    • 2021-06-11
    • 2021-07-31
    • 2020-04-17
    相关资源
    最近更新 更多