Я запускаю образ arm32v7 / ubuntu на моем сервере x86 с qemu, шаг настройки среды примерно такой:
## compile qemu static
apt build-dep qemu
git clone --depth 1 git://git.qemu.org/qemu.git
cd qemu
git submodule update --init --recursive
./configure --prefix=$(cd ..; pwd)/qemu-user-static --static --disable-system --enable-linux-user
make -j8
make install
Затем я запускаю образ docker на моем сервере x86:
cd ../qemu-user-static
docker run -v `pwd`/qemu-user-static/bin/qemu-arm-static:/usr/bin/qemu-arm-static -ti arm32v7/ubuntu uname -m
Результат будет armv7l
.
Затем я компилирую свой код в своей среде x86 с помощью компилятора arm toolchains. Код такой:
// main.cpp
#include "fun.hpp"
int main() {
print();
}
// fun.hpp
void print();
// fun.cpp
#include <iostream>
#include "fun.hpp"
using namespace std;
void print() {
cout << "hello world" << endl;
}
Мой CMakeLists.txt
выглядит так:
cmake_minimum_required(VERSION 2.8.12)
project(example)
include_directories(./)
link_directories(./build)
link_directories(./)
set(toolchain_dir /opt/hisi-linux/x86-arm/arm-himix200-linux)
SET(CMAKE_C_COMPILER ${toolchain_dir}/bin/arm-himix200-linux-gcc)
SET(CMAKE_CXX_COMPILER ${toolchain_dir}/bin/arm-himix200-linux-g++)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -mfpu=neon -mfloat-abi=softfp -fPIC -fno-lto -lgomp")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a -mfpu=neon 7")
set(CMAKE_LINKER "${toolchain_dir}/bin/arm-himix200-linux-ar")
set(CMAKE_AR "${toolchain_dir}/bin/arm-himix200-linux-ar")
set( CMAKE_BUILD_TYPE "Release" )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -lgomp -fno-lto -O3 -Wall -s")
add_compile_options(-Os -s -fPIC -fvisibility-inlines-hidden -ffunction-sections -fdata-sections)
add_link_options(-Wl,--gc-sections -Wl,--strip-all)
add_executable(main main.cpp)
target_link_libraries(main -ltest)
add_library(test SHARED ./fun.cpp)
После кросс-компиляции на моей платформе x86:
mkdir -p build && cd build
cmake ..
make
Я получаю файлы main
и libtest.so
. Затем я попытался запустить его в среде arm32v7/ubuntu
на основе qemu. Я получил сообщение об ошибке:
./main: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
Также я заметил, что если я не использую разделяемую память и скомпилирую весь код в один исполняемый файл, проблем с его запуском в руке docker не будет. . В чем проблема и как я могу ее решить, пожалуйста?