Почему сборка cmake не устанавливает путь в кавычках?

#cmake #android-ndk

#cmake #android-ndk

Вопрос:

У меня Visual Studio Pro 2019 (VS), и я переключил версии NDK с 16 на 18.

Дело в том, что мой ndk 16 был старым, из Android Studio, а новый я установил непосредственно из VS (Tools / Android / Android SDK Manager)

Мой проект использует файлы cmake среди прочего для сборки, и я должен включить в них новый путь для ndk.

Новый путь к ndk содержит больше ПРОБЕЛОВ, и это то, что меня беспокоит.

Я собираю свой проект, и возникает следующая ошибка:

 The C compiler
3>  
3>      "C:/Program Files (x86)/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe"
3>  
3>    is not able to compile a simple test program.
3>  
3>    It fails with the following output:
3>  
3>      Change Dir: D:/Repos/Client_main/client/BuildResults/CustomDebug_AndroidArm_MRClient/CMakeFiles/CMakeTmp
3>      
3>      Run Build Command(s):ninja.exe cmTC_633e0 amp;amp; [1/2] Building C object CMakeFiles/cmTC_633e0.dir/testCCompiler.c.o
3>      FAILED: CMakeFiles/cmTC_633e0.dir/testCCompiler.c.o 
3>      C:PROGRA~2AndroidANDROI~1NDK-BU~1TOOLCH~1llvmprebuiltWINDOW~1binclang.exe --target=armv7-none-linux-androideabi27 --gcc-toolchain="C:/Program Files (x86)/Android/android-sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64" --sysroot="C:/Program Files (x86)/Android/android-sdk/ndk-bundle/sysroot"   -isystem C:/Program Files (x86)/Android/android-sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon -Wa,--noexecstack -Wformat -Werror=format-security   -fPIE -o CMakeFiles/cmTC_633e0.dir/testCCompiler.c.o   -c testCCompiler.c
3>D:ReposClient_mainclientMediaroomAndroidAppclang.exe : error : no such file or directory: 'Files'
3>D:ReposClient_mainclientMediaroomAndroidAppclang.exe : error : no such file or directory: '(x86)/Android/android-sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi'
3>      ninja: build stopped: subcommand failed.
  

После моего исследования я выяснил, что причиной проблемы является следующий параметр:

 -isystem C:/Program Files (x86)/Android/android-sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi
  

Он должен быть в кавычках (-isystem «C:…»).
Я понятия не имею, как это сделать, это не мой код, похоже, что cmake создает команду для clang.exe для запуска, но я понятия не имею, как это исправить.

Есть идеи?

Редактировать 1: команда CMAKE:

   <CmakeCommand><![CDATA[
call "$(VsToolsDir)VsDevCmd.bat" -no_logo
cmake -G "Ninja" -DCMAKE_INSTALL_PREFIX:PATH="$(MstvBuildTypeDir)" -DBUILD_PLATFORM:STRING="Android" -DANDROID_TOOLCHAIN:STRING="clang" -DCMAKE_SYSTEM_NAME:STRING="Android" -DANDROID_API_LEVEL:STRING="27" -DANDROID_PLATFORM:STRING="android-27" -DANDROID_ABI:STRING="armeabi-v7a" -DCMAKE_TOOLCHAIN_FILE:STRING="C:/PROGRA~2/Android/ANDROI~1/NDK-BU~1/build/cmake/android.toolchain.cmake" -DCMAKE_SYSTEM_VERSION:STRING="27" -DCMAKE_ANDROID_ARCH_ABI:STRING="armeabi-v7a" -DANDROID_STL:STRING="c  _shared" -DBUILD_TYPE:STRING="$(NativeLowercaseConfig)" -DBUILD_VARIANT:STRING="$(NativeLowercaseVariant)" -DBUILD_TARGET:STRING="Arm" -DCMAKE_NO_SYSTEM_FROM_IMPORTED:STRING="TRUE" -DTOOLCHAIN_ROOT:STRING="C:/PROGRA~2/Android/ANDROI~1/NDK-BU~1/toolchains/llvm/prebuilt/windows-x86_64"  -DCMAKE_BUILD_TYPE="$(Configuration)" -DCMAKE_MAKE_PROGRAM="ninja.exe" "$(MstvClientDir)"
]]></CmakeCommand>
  

Правка 2:
Я прочитал все, что в каталоге LLVM (там есть clang.exe ) НЕ ДОЛЖНО быть пути, содержащего пробелы, это все еще имеет место в версии 7.0.2?
Спасибо, что уделили мне время.

Комментарии:

1. Переместить проект в путь без пробелов?

2. Это сработало бы (уже сделано, но пришлось отменить изменение), но мне нужно, чтобы он был там (путь по умолчанию для ndk), потому что многие другие скрипты используют его оттуда.

3. @squareskittles Я добавил команду cmake в сообщение mby, чтобы вы могли увидеть кое-что полезное 🙂

4. Попробуйте настроить с помощью этой цепочки инструментов «пустой» проект CMake, который CMakeLists.txt состоит только из двух строк: cmake_minimum_required(VERSION 3.10) и project(foo) .

5. @Tsyvarev простите меня, я не понимаю, под «пустой» цепочкой инструментов вы подразумеваете удаление следующей строки из команды cmake? (-DCMAKE_TOOLCHAIN_FILE:STRING=»C:/PROGRA~2/Android/ANDROI~1/NDK-BU~1/build/cmake/android.toolchain.cmake») и для второй части вы хотите, чтобы мой основной CMakeLists.txt файл должен состоять из тех двух строк, которые вы упомянули? Кроме того, может быть, лучше удалить этот флаг -isystem, и если да, то как? Я пытался с помощью -DCMAKE_NO_SYSTEM_FROM_IMPORTED:STRING=»YES», но это не сработало

Ответ №1:

В конце концов, я не смог решить проблему так, как хотел, но нашел другое решение, которое удерживает NDK в исходном положении.

Я создал символическую ссылку, подобную этой:

 mklink /J C:ProFiles86 "C:Program Files (x86)"
  

После этого я изменил свой путь, чтобы использовать ссылку (C:ProFiles86 …) и это сработало.

Опять же, это не идеально для меня, потому что для этого требуется дополнительный скрипт, который должен быть включен в мой проект, но пока этого достаточно.