Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

407
Visualizações
Cmake construye con bibliotecas externas

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.hpp

Despué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 2

Por qué tengo este error. ¡¡¡Ayudame por favor!!!

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

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 .

over 4 years ago · Santiago Trujillo Relatório

0

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 install

Ese 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í.

over 4 years ago · Santiago Trujillo Relatório

0

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.cmake

Ahora, 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

Aumentar

¿Cómo se agregan bibliotecas Boost en CMakeLists.txt?

nlohmann/json

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)
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda