Soy principiante en construcción de brazos. Quiero construir este código para la plataforma armel. Tengo un código:
#include <boost/container/flat_map.hpp> #include <boost/container/flat_set.hpp> #include <nlohmann/json.hpp> int main() { return 0; }También tengo el archivo Cmake:
cmake_minimum_required(VERSION 2.8.10 FATAL_ERROR) project(test CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++-10) set(SRC_FILES test.cpp) add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED) add_definitions(-DBOOST_ALL_NO_LIB) add_definitions(-DBOOST_NO_RTTI) add_definitions(-DBOOST_NO_TYPEID) add_definitions(-DBOOST_ASIO_DISABLE_THREADS) add_executable(${PROJECT_NAME} ${SRC_FILES})Instalo la biblioteca nlohmann en:
/usr/local/include/nlohmann/json.hppDespués de generar make y make:
/home/test-machine/project-dir/test/test.cpp:3:10: fatal error: nlohmann/json.hpp: No such file or directory 3 | #include <nlohmann/json.hpp> | ^~~~~~~~~~~~~~~~~~~ compilation terminated. make[2]: *** [CMakeFiles/test.dir/build.make:82: CMakeFiles/test.dir/test.cpp.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:95: CMakeFiles/test.dir/all] Error 2 make: *** [Makefile:103: all] Error 2Por qué tengo este error. ¡¡¡Ayudame por favor!!!
Me parece que la forma más correcta sería instalar correctamente la biblioteca y luego usar la directiva find_package .
# CMakeLists.txt find_package(nlohmann_json 3.2.0 REQUIRED) ... add_library(foo ...) ... target_link_libraries(foo PRIVATE nlohmann_json::nlohmann_json)El ejemplo anterior es parte de la documentación de nlohmann Cmake .
Con compiladores no nativos, debe configurar todo el entorno.
De hecho, al hacerlo, recomendaría encarecidamente utilizar un archivo de cadena de herramientas .
Con eso, puede configurar su cadena de herramientas, o incluso varias cadenas de herramientas.
Luego, para el medio ambiente, sugeriría instalar las bibliotecas usando su instalador y dejar que CMake las encuentre. Tome nlohmann json por ejemplo:
nlohmann_json$ mkdir build nlohmann_json$ cd build nlohmann_json/build$ cmake .. -DCMAKE_INSTALL_PREFIX=/home/youruser/arm-prefix -DCMAKE_TOOLCHAIN_FILE=yourtoolchain.cmake nlohmann_json/build$ cmake --build . --target installEse comando configurará nlohmann json con su cadena de herramientas y lo instalará en un nuevo prefijo.
Luego, en su proyecto, puede tener dicha cadena de herramientas y dicho archivo CMakeLists.txt:
cadena de herramientas.cmake:
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++-10) set(CMAKE_C_COMPILER arm-linux-gnueabi-gcc-10) set(CMAKE_STAGING_PREFIX /home/youruser/arm-prefix) set(CMAKE_SYSTEM_PREFIX_PATH /home/youruser/arm-prefix) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)CMakeListas.txt:
project(test CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(test) find_package(nlohmann_json REQUIRED) target_sources(test PRIVATE test.cpp) target_link_libraries(test PUBLIC nlohmann_json::nlohmann_json) La magia está en la ruta del prefijo. Cuando establece un prefijo de instalación para instalar bibliotecas y establece la misma ruta de prefijo al crear su proyecto, find_package de repente funciona. Si usa la misma cadena de herramientas entre esos dos proyectos, CMake detectará esos dos paquetes como compatibles.
Tenga en cuenta que tampoco usé explícitamente variables en el archivo CMakeLists. Esto se debe a que las variables son un punto débil de CMake y dan como resultado un comportamiento inesperado. En un archivo CMake normal para definir un proyecto, su uso debería ser raro.
Además, manténgase alejado de add_definitions , link_directories , include_directories y todos esos. Siempre prefiera target_compile_definitions , target_link_libraries , target_include_directories y otros comandos basados en objetivos.
En cuanto a boost, no conozco muy bien su sistema de compilación. Puede haber formas de compilar la biblioteca e instalarla, pero mi conocimiento termina aquí.
Hay algunos problemas con su código. Si no te importa, usaré CMake más nuevo.
# CMakeLists.txt cmake_minimum_required(VERSION 3.13) project(test LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) add_executable(foobar) target_sources(foobar PRIVATE test.cpp ) target_compile_definitions(foobar PRIVATE BOOST_ERROR_CODE_HEADER_ONLY BOOST_SYSTEM_NO_DEPRECATED BOOST_ALL_NO_LIB BOOST_NO_RTTI BOOST_NO_TYPEID BOOST_ASIO_DISABLE_THREADS )Para especificar su compilador ARM, use un CMAKE_TOOLCHAIN_FILE. Si especifica su compilador en su código CMake, puede ser bueno al principio, pero causará problemas más adelante.
# arm.cmake set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++-10) set(CMAKE_C_COMPILER arm-linux-gnueabi-g-10)Ahora cuando hagas tu proyecto haz lo siguiente:
cd <your-project> cmake -S . -B build/ -D CMAKE_TOOLCHAIN_FILE=arm.cmakeAhora, el problema que queda con su código es que no tiene forma de encontrar las dependencias de terceros.
Necesitas agregar código para encontrar/enlazar boost . Y encuentra/enlaza nlohmann/json
¿Cómo se agregan bibliotecas Boost en CMakeLists.txt?
Este repositorio en realidad tiene documentos bastante buenos sobre cómo agregar la biblioteca a su proyecto CMake.
https://github.com/nlohmann/json#cmake
TLDR:
Para usar esta biblioteca desde un proyecto de CMake, puede ubicarla directamente con find_package() y usar el destino importado con espacio de nombres de la configuración del paquete generado:
# CMakeLists.txt find_package(nlohmann_json 3.2.0 REQUIRED) ... add_library(foo ...) ... target_link_libraries(foo PRIVATE nlohmann_json::nlohmann_json)