На OpenCV.Компилятор C ++ не может скомпилировать простую тестовую программу.Использование Clang ++ - PullRequest
0 голосов
/ 18 сентября 2018

Цель: Скомпилировать внешнюю библиотеку для Android с использованием скрипта кросс-компиляции с Conan и OpenCV.

Моя среда сегодня:

  • ОС: MacOS High Sierra 10.13.6 ;
  • Конан: 1.7.3 ../Cellar/conan/1.6.1/bin/conan
  • Python: 2.7.10 /usr/bin/python (Пробовал с 3 тоже)
  • GCC / C ++: 8.2.0 /opt/local/bin/gcc-mp-8 || /opt/local/bin/g++-mp-8 (цитируется, потому что clang использует c ++)
  • Clang / Clang ++: 9.1.0 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin (это не тот, который использует программа)
  • CMake: 3.12.2 /Applications/CMake.app/Contents/bin/cmake
  • Используется NDK: 17

Проблема: Открытое резюме не компилятор C ++.Главное сообщение:

-- The CXX compiler identification is Clang 6.0.2
-- The C compiler identification is Clang 6.0.2
-- Check for working CXX compiler: /Users/<user>/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++
-- Check for working CXX compiler: /Users/<user>/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- broken
CMake Error at /Applications/CMake.app/Contents/share/cmake-3.12/Modules/CMakeTestCXXCompiler.cmake:45 (message):
The C++ compiler

"/Users/<user>/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++"

is not able to compile a simple test program.

It fails with the following output:

Change Dir: /Users/<user>/.conan/data/OpenCV/3.4.1/ins/stable/build/4492059a128c69658616e0cf3d3f007e2ce6603c/CMakeFiles/CMakeTmp

Run Build Command:"/Users/<user>/Library/Android/sdk/cmake/3.6.4111459/bin/ninja" "cmTC_4338c"
[1/2] Building CXX object CMakeFiles/cmTC_4338c.dir/testCXXCompiler.cxx.o
[2/2] Linking CXX executable cmTC_4338c
FAILED: : && /Users/<user>/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --sysroot=/Users/<user>/Library/Android/sdk/ndk-bundle/sysroot   -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/cmTC_4338c.dir/testCXXCompiler.cxx.o  -o cmTC_4338c   && :
ld: library not found for -lc++
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

CMake will not be able to correctly generate this project.
  • CMakeTmp - это пустая папка.
  • CMakeError имеет то же сообщение после «..fail со следующим выводом»

Запрашивается библиотека LD .Но на папке LLVM нет LLVM-LD , она была удалена на 4.0, если я не ошибаюсь.Я использую 10.0.Это то, что есть в моей папке

enter image description here

  • Obs : Как вы можете видеть, я не знаю, какправильно установите Флаг и не знаете, изменит ли это что-то.

Код:

Buildscript.py

build_dir = "build_Android_Debug"
conan_install_arguments = "-s compiler=clang -s compiler.version=6.0 -s compiler.libcxx=libc++ -s os=Android -s os.api_level=26 -s arch=armv8 -s build_type=Debug"

android_cmake_toolchain_path = current_dir_absolute_path + "/cmake-toolchains/Android.cmake"
conan_install_arguments += " --env CONAN_CMAKE_TOOLCHAIN_FILE=\"%s\"" % android_cmake_toolchain_path

conan_install_arguments += " --env CONAN_CMAKE_FIND_ROOT_PATH=/Users/<user>/Library/Android/sdk/ndk-bundle/sysroot"
conan_install_arguments += " --env PATH=[/Users/<user>/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin]"
conan_install_arguments += " --env AR=llvm-ar"
conan_install_arguments += " --env AS=llvm-as"
conan_install_arguments += " --env CC=clang"
conan_install_arguments += " --env CXX=clang++"

conan_install_command = "cd %s && conan install .. %s" % (build_dir, conan_install_arguments)

os.system(conan_install_command)

Android.cmake

set(CMAKE_MAKE_PROGRAM /Users/vcanato/Library/Android/sdk/cmake/3.6.4111459/bin/ninja)
set(CMAKE_ANDROID_NDK /Users/vcanato/Library/Android/sdk/ndk-bundle/)

Что я уже пробовал

На Buildscript

compiler=clang
compiler.version=5.0
compiler.libcxx=libc++
os=Android
os.api_level=21
arch=armv7

Obs: Gcc устарел, поэтомубыло бы хорошим решением без, но все равно не сработало.

compiler=gcc
compiler.version=4.9
compiler.libcxx=libstdc++
os=Android
os.api_level=21
arch=armv7
build_type=Release

На Android.cmake:

cmake_minimum_required(VERSION 3.4 FATAL_ERROR)
include_directories("/usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0")
include_directories( "/usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0/x86_64-apple-darwin17.7.0/bits")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I /usr/local/include/c++/8.2.0/")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -X /usr/include/c++/4.2.1/")
set(CMAKE_CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED)
set(CMAKE_CXX_COMPILER "/usr/bin/g++")
set(CMAKE_CXX_COMPILER "/Users/vcanato/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++")
set(CMAKE_C_COMPILER "/usr/bin/gcc")
set(ANDROID_ABI arm64-v8a)
set(CMAKE_ANDROID_API android-21)
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_TOOLCHAIN_FILE /Users/<user>/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake)

set(CMAKE_ANDROID_NDK /Users/<user>/Library/Android/sdk/ndk-bundle/ CACHE FILEPATH "")

На CmakeList.txt

set(CMAKE_CXX_COMPILER "/Users/vcanato/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++")
set(CMAKE_CXX_COMPILER "/usr/bin/g++")

До и после project()

Наборы инструментов:

/Users/vcanato/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9
/Users/vcanato/Library/Android/sdk/ndk-bundle/toolchains/x86_64-4.9

Я даже пытаюсь создать свой собственный автономный набор инструментов и использую Руководство по созданию перекрестных конусов Conan для Android

Аналогичный вопрос по стеку и GitHub:

1 Ответ

0 голосов
/ 19 сентября 2018

Правильным способом для указания CMAKE_MAKE_COMMAND в цепочке инструментов является установка CACHE переменной:

set(CMAKE_MAKE_PROGRAM /Users/vcanato/Library/Android/sdk/cmake/3.6.4111459/bin/ninja
    CACHE FILEPATH "")

Это подразумевается как документацией (если переменная установленагенератор, версия CACHE установлена), а в это CMake рассылка .

Дополнительные объяснения

Пустота первой строки в сообщении

Make command was: "" "cmTC_27ba1"

должен быть первым сигналом " что-то идет не так ".Вместо пустой строки это должен быть исполняемый файл, соответствующий генератору CMake (или абсолютный путь к исполняемому файлу).В вашем случае исполняемый файл генератора - ninja.

Обычно CMake сообщает о проблеме более наглядным способом:

CMAKE_MAKE_PROGRAM не установлен

...