Я пытаюсь настроить файлы CMakeLists, чтобы обеспечить возможность компиляции для главного компьютера (aarch64 linux) и встроенной цели посредством кросс-компиляции (32-разрядная версия Armv7). У меня есть логика для установки BOOST_ROOT в зависимости от цели. Для хоста я не получаю ошибок при компиляции, но при кросс-компиляции получаю ошибку. Предварительно созданные библиотеки Boost для хоста и встроенной цели находятся в отдельных нестандартных каталогах на хосте со схожей структурой. Для встроенной цели библиотеки Boost находятся в каталоге «/opt/boost-1.79.0-armv7/lib». Я упускаю что-то еще в CMake, что необходимо настроить для кросс-компиляции, а не для компиляции для хост-компьютера?
Вывод сборки:
< pre class="lang-bash Prettyprint-override">-- The C compiler identification is GNU 12.3.1
-- The CXX compiler identification is GNU 12.3.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /opt/arm-gnu-toolchain-12.3.rel1-aarch64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /opt/arm-gnu-toolchain-12.3.rel1-aarch64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
We are cross-compiling!!!
CMake Warning (dev) at CMakeLists.txt:44 (find_package):
Policy CMP0144 is not set: find_package uses upper-case
_ROOT
variables. Run "cmake --help-policy CMP0144" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
CMake variable BOOST_ROOT is set to:
/opt/boost-1.79.0-armv7
For compatibility, find_package is ignoring the variable, but code in a
.cmake module might still use it.
This warning is for project developers. Use -Wno-dev to suppress it.
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1706 ] _boost_TEST_VERSIONS = "1.84.0;1.84;1.83.0;1.83;1.82.0;1.82;1.81.0;1.81;1.80.0;1.80;1.79.0;1.79"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1707 ] Boost_USE_MULTITHREADED = "TRUE"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1708 ] Boost_USE_STATIC_LIBS =
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1709 ] Boost_USE_STATIC_RUNTIME =
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1710 ] Boost_ADDITIONAL_VERSIONS =
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1711 ] Boost_NO_SYSTEM_PATHS =
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1743 ] BOOST_ROOT = "/opt/boost-1.79.0-armv7"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1744 ] ENV{BOOST_ROOT} =
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1745 ] BOOST_INCLUDEDIR =
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1746 ] ENV{BOOST_INCLUDEDIR} =
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1747 ] BOOST_LIBRARYDIR =
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1748 ] ENV{BOOST_LIBRARYDIR} =
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1820 ] _boost_INCLUDE_SEARCH_DIRS = "/opt/boost-1.79.0-armv7/include;/opt/boost-1.79.0-armv7;PATHS;C:/boost/include;C:/boost;/sw/local/include"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1821 ] _boost_PATH_SUFFIXES = "boost-1_84_0;boost_1_84_0;boost/boost-1_84_0;boost/boost_1_84_0;boost-1_84;boost_1_84;boost/boost-1_84;boost/boost_1_84;boost-1_83_0;boost_1_83_0;boost/boost-1_83_0;boost/boost_1_83_0;boost-1_83;boost_1_83;boost/boost-1_83;boost/boost_1_83;boost-1_82_0;boost_1_82_0;boost/boost-1_82_0;boost/boost_1_82_0;boost-1_82;boost_1_82;boost/boost-1_82;boost/boost_1_82;boost-1_81_0;boost_1_81_0;boost/boost-1_81_0;boost/boost_1_81_0;boost-1_81;boost_1_81;boost/boost-1_81;boost/boost_1_81;boost-1_80_0;boost_1_80_0;boost/boost-1_80_0;boost/boost_1_80_0;boost-1_80;boost_1_80;boost/boost-1_80;boost/boost_1_80;boost-1_79_0;boost_1_79_0;boost/boost-1_79_0;boost/boost_1_79_0;boost-1_79;boost_1_79;boost/boost-1_79;boost/boost_1_79"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1906 ] Boost_LIB_PREFIX = ""
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1907 ] Boost_NAMESPACE = "boost"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:953 ] _boost_COMPILER = "-gcc" (guessed)
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:1943 ] _boost_MULTITHREADED = "-mt"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:2021 ] _boost_ARCHITECTURE_TAG = "" (detected)
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:2025 ] _boost_RELEASE_ABI_TAG = "-"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:2026 ] _boost_DEBUG_ABI_TAG = "-d"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:2086 ] _boost_LIBRARY_SEARCH_DIRS_RELEASE = "/opt/boost-1.79.0-armv7/lib;/opt/boost-1.79.0-armv7/stage/lib;Boost_INCLUDE_DIR-NOTFOUND/lib;Boost_INCLUDE_DIR-NOTFOUND/../lib;Boost_INCLUDE_DIR-NOTFOUND/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:2087 ] _boost_LIBRARY_SEARCH_DIRS_DEBUG = "/opt/boost-1.79.0-armv7/lib;/opt/boost-1.79.0-armv7/stage/lib;Boost_INCLUDE_DIR-NOTFOUND/lib;Boost_INCLUDE_DIR-NOTFOUND/../lib;Boost_INCLUDE_DIR-NOTFOUND/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib"
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:2272 ] Searching for PROGRAM_OPTIONS_LIBRARY_RELEASE: boost_program_options-gcc-mt-;boost_program_options-gcc-mt;boost_program_options-gcc-mt;boost_program_options-mt-;boost_program_options-mt;boost_program_options-mt;boost_program_options-mt;boost_program_options
-- [ /usr/share/cmake-3.28/Modules/FindBoost.cmake:2327 ] Searching for PROGRAM_OPTIONS_LIBRARY_DEBUG: boost_program_options-gcc-mt-d-;boost_program_options-gcc-mt-d;boost_program_options-gcc-mt-d;boost_program_options-mt-d-;boost_program_options-mt-d;boost_program_options-mt-d;boost_program_options-mt;boost_program_options
CMake Error at /usr/share/cmake-3.28/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find Boost (missing: Boost_INCLUDE_DIR program_options) (Required
is at least version "1.79.0")
Call Stack (most recent call first):
/usr/share/cmake-3.28/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-3.28/Modules/FindBoost.cmake:2393 (find_package_handle_standard_args)
CMakeLists.txt:44 (find_package)
-- Configuring incomplete, errors occurred!
Change Dir: '/home/theuser/Programming/Beaglebone/_Build'
Run Build Command(s): /usr/bin/ninja -v -j 6
ninja: error: loading 'build.ninja': No such file or directory
Для справки я отправлю файл CMakeLists верхнего уровня и файлtoolchain.cmake:
cmake_minimum_required( VERSION 3.25 )
# Project name and a few useful settings. Other commands can pick up the results
project( xmbed
VERSION 3.0.0
DESCRIPTION "Embedded C/C++ project with the Beaglebone Black (BBB)"
LANGUAGES C CXX )
set( xmbed_PROJ_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR} )
set( xmbed_DEPLOY_ROOT_DIR ${xmbed_PROJ_ROOT_DIR}/_Deployment )
set( CMAKE_C_STANDARD 17 )
set( CMAKE_CXX_STANDARD 20 )
set( CMAKE_CXX_EXTENSIONS OFF )
set( CMAKE_CXX_STANDARD_REQUIRED TRUE )
set( CMAKE_EXPORT_COMPILE_COMMANDS ON )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra" )
if ( CMAKE_CROSSCOMPILING AND CMAKE_BUILD_TYPE STREQUAL "Release" )
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Os -s" )
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os -s" )
else()
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g" )
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g" )
endif()
set(Boost_DEBUG 1)
if( CMAKE_CROSSCOMPILING )
message( "We are cross-compiling!!!" )
set( BOOST_ROOT /opt/boost-1.79.0-armv7 )
elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "aarch64")
set( BOOST_ROOT /opt/boost-1.79.0-aarch64 )
else()
set( BOOST_ROOT /opt/boost-1.79.0-amd64 )
endif()
find_package( Boost 1.79.0 REQUIRED COMPONENTS program_options)
set( Boost_NO_BOOST_CMAKE ON )
set( Boost_NO_SYSTEM_PATHS ON )
set( Boost_USE_MULTITHREADED ON )
set( Boost_USE_STATIC_LIBS ON )
set( Boost_USE_STATIC_RUNTIME OFF )
set( BOOST_ALL_DYN_LINK OFF )
add_subdirectory( common )
add_subdirectory( hardware )
add_subdirectory( software )
add_subdirectory( app )
add_subdirectory( test )
add_subdirectory( docs )
# CMake toolchain file for building ARM software
# this one is important
set(CMAKE_SYSTEM_NAME Linux)
#this one not so much
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR armv7)
# where is the target environment
if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "aarch64")
set(CMAKE_FIND_ROOT_PATH /opt/arm-gnu-toolchain-12.3.rel1-aarch64-arm-none-linux-gnueabihf)
elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")
set(CMAKE_FIND_ROOT_PATH /opt/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-linux-gnueabihf)
endif()
set(TOOLS /bin/arm-none-linux-gnueabihf-)
# specify the cross compiler
set(CMAKE_C_COMPILER ${CMAKE_FIND_ROOT_PATH}${TOOLS}gcc)
set(CMAKE_CXX_COMPILER ${CMAKE_FIND_ROOT_PATH}${TOOLS}g++)
set(CMAKE_STRIP ${CMAKE_FIND_ROOT_PATH}${TOOLS}strip)
set(CMAKE_AR ${CMAKE_FIND_ROOT_PATH}${TOOLS}ar)
set(CMAKE_ASM_COMPILER ${CMAKE_FIND_ROOT_PATH}${TOOLS}as)
set(CMAKE_LINKER ${CMAKE_FIND_ROOT_PATH}${TOOLS}ld)
set(CMAKE_OBJCOPY ${CMAKE_FIND_ROOT_PATH}${TOOLS}objcopy)
set(CMAKE_RANLIB ${CMAKE_FIND_ROOT_PATH}${TOOLS}ranlib)
set(CMAKE_SIZE ${CMAKE_FIND_ROOT_PATH}${TOOLS}size)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7")
# search for programs in the build host directories
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
# for libraries and headers in the target directories
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
Подробнее здесь: https://stackoverflow.com/questions/790 ... ile-target
Компиляция с BOOST_ROOT успешна для хоста, но не удалась для цели кросс-компиляции ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Компиляция с BOOST_ROOT успешна для хоста, но не удалась для цели кросс-компиляции
Anonymous » » в форуме Linux - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-