CMake & Arm Cross compilation based Windows systems

CMakeLists.txt

  1. cmake_minimum_required(VERSION 3.12)
  2. project(untitled1)
  3.  
  4. SET(CMAKE_SYSTEM_NAME Linux)
  5.  
  6. add_definitions("-std=c++17")
  7.  
  8. SET(CMAKE_C_COMPILER   arm-linux-gnueabihf-gcc)
  9. SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
  10.  
  11. if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Windows")
  12.     set(BOOST_ROOT "C:/MinGW/msys/1.0/home/d/boost_1_68_0")
  13. else()
  14.     set(BOOST_ROOT /root/Downloads/boost_1_68_0)
  15. endif()
  16.  
  17. set(Boost_USE_STATIC_LIBS ON)
  18. set(Boost_USE_MULTITHREADED ON)
  19.  
  20. find_package(Boost COMPONENTS regex system date_time timer REQUIRED)
  21. if(Boost_FOUND)
  22.     include_directories(${Boost_INCLUDE_DIRS})
  23.     link_directories("${Boost_INCLUDE_DIRS}/stage/lib")
  24.     include_directories(sdk/inc)
  25.     link_directories("sdk/lib")
  26.     MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")
  27.     MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}.")
  28.     MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")
  29.  
  30.     add_executable(untitled1 main.cpp)
  31.  
  32.     TARGET_LINK_LIBRARIES(untitled1 ${Boost_LIBRARIES} "-lpthread" "-lpos" "-lrt" "-lpng" "-liconv" "-lfreetype" "-lz" "-l:libboost_system.a")
  33. endif()

GNUlinux_config.cmake

  1. set(GNULINUX_PLATFORM ON)
  2. set(CMAKE_SYSTEM_NAME "Linux")
  3. set(CMAKE_SYSTEM_PROCESSOR "arm")
  4.  
  5. if(NOT DEFINED ENV{NE10_LINUX_TARGET_ARCH})
  6.    set(NE10_LINUX_TARGET_ARCH "armv7")
  7. else()
  8.    set(NE10_LINUX_TARGET_ARCH $ENV{NE10_LINUX_TARGET_ARCH})
  9. endif()
  10.  
  11. if(NE10_LINUX_TARGET_ARCH STREQUAL "armv7")
  12.    set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
  13.    set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
  14.    set(CMAKE_ASM_COMPILER arm-linux-gnueabihf-as)
  15.    find_program(CMAKE_AR NAMES "arm-linux-gnueabihf-ar")
  16.    find_program(CMAKE_RANLIB NAMES "arm-linux-gnueabihf-ranlib")
  17. elseif(NE10_LINUX_TARGET_ARCH STREQUAL "aarch64")
  18.    set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
  19.    set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
  20.    set(CMAKE_ASM_COMPILER aarch64-linux-gnu-as)
  21.    find_program(CMAKE_AR NAMES "aarch64-linux-gnu-ar")
  22.    find_program(CMAKE_RANLIB NAMES "aarch64-linux-gnu-ranlib")
  23. endif()
  24.  
  25. mark_as_advanced(CMAKE_AR)
  26. mark_as_advanced(CMAKE_RANLIB)

The Most Important Thing on Windows

cmake -DCMAKE_TOOLCHAIN_FILE=GNUlinux_config.cmake ..

Cross compile with Node.js C++ Addons to ARM

Set ENV

  1. export HOST=arm-linux-gnueabihf
  2. export CPP="${HOST}-gcc -E"
  3. export STRIP="${HOST}-strip"
  4. export OBJCOPY="${HOST}-objcopy"
  5. export AR="${HOST}-ar"
  6. export RANLIB="${HOST}-ranlib"
  7. export LD="${HOST}-ld"
  8. export OBJDUMP="${HOST}-objdump"
  9. export CC="${HOST}-gcc"
  10. export CXX="${HOST}-g++"
  11. export NM="${HOST}-nm"
  12. export AS="${HOST}-as"
  13. export LD="$CXX"
  14. export LINK="$CXX"
  15. export GYP_DEFINES="armv7=0"

Build

  1. node-gyp --arch arm configure build

Test

  1. root@imx6ul7d:~# node hello.js      
  2. world

TIP 0

  1. {
  2.   "targets": [
  3.     {
  4.       "target_name": "addon",
  5.       "sources": [ "test_api.cc" ],
  6. 	  "include_dirs" : ["sdk/inc"],
  7. 	  "link_settings": {"libraries": [ "-L/mnt/hgfs/tmp0511/sdk/lib"] },
  8. 	  "libraries": [ "-lpos", "-lpthread", "-lrt", "-lpng", "-liconv", "-lfreetype", "-lz" ],
  9.     }
  10.   ]
  11. }

TIP 1

  1. using v8::FunctionCallbackInfo;
  2. using v8::Isolate;
  3. using v8::Local;
  4. using v8::Object;
  5. using v8::String;
  6. using v8::Value;
  7. using v8::Number;
  8. using v8::Exception;
  9.  
  10. void js_Exchange(const FunctionCallbackInfo<Value>& args) {
  11.   Isolate* isolate = args.GetIsolate();
  12.  
  13.   int slot = args[0]->NumberValue();
  14.  
  15.   String::Utf8Value param1(args[1]->ToString());  
  16.   char *szApdu = *param1;  
  17.  
  18.   uint8_t apdu[300] = "\0";
  19.   MyAHex((uint8_t *)szApdu, apdu, strlen(szApdu));
  20.  
  21.   uint8_t rpdu[300] = "\0";
  22.   uint32_t rpdu_len = 0;
  23.   char szResult[300] = "\0";
  24.  
  25.   int ret = Exchange(slot, apdu, strlen(szApdu) / 2, rpdu, &rpdu_len);
  26.   if(0 == ret) {
  27.     MyHexA(rpdu, (uint8_t *)szResult, rpdu_len);
  28.     args.GetReturnValue().Set(String::NewFromUtf8(isolate, szResult));
  29.   } else {
  30.     args.GetReturnValue().Set(String::NewFromUtf8(isolate, ""));
  31.   }
  32. }

OpenCV3 On ARM

Source Code Dir

CMake-GUI Configure

Configure/Generate

Unix Makefiles
Specify options for cross-compiling

Choose ARM – LINUX

Operating System : arm-linux
C Compilers :
C++ Compilers :
Target Root : The Cross Compiler BIN Directory

CMAKE_INSTALL_PREFIX

make & make install

  1. make
  2. make install

Maybe Need It !


<>

The END

  1. tar jcvf opencv-arm.tar.bz2 opencv-arm/