Как собрать статическую библиотеку.a для ARM с использованием кросс-компилятора?

Я пытался статически скомпилировать https://cpp-netlib.org/ и rpclib для устройства ARM (так же, как ZEDboard)

Все, что я сделал, это изменил настройки компилятора и системы в файле CMakeLists.txt.

    set(CMAKE_SYSTEM_NAME Linux)
    set(CMAKE_SYSTEM_PROCESSOR arm)

    set(CMAKE_SYSROOT /home/a/buildroot-2018.05/output/host/arm-buildroot-linux-uclibcgnueabihf/sysroot/)
    set(tools /home/a/buildroot-2018.05/output/host/bin/)
    set(CMAKE_C_COMPILER ${tools}arm-buildroot-linux-uclibcgnueabihf-gcc)
    set(CMAKE_CXX_COMPILER ${tools}arm-buildroot-linux-uclibcgnueabihf-g++)

    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)

После того, как Makefile был создан cmake, я запустил make, и никакого вывода не было. Как я понимаю, каталоги сборки должны появиться.

Для rpclib дела пошли лучше. Он скомпилировал файл librpc.a, но, к счастью, он не связан с моей программой.

arm-buildroot-linux-uclibcgnueabihf-g++ -I/home/a/rpclib/include/ -Xlinker -static /home/a/rpclib/librpc.a main.cpp

производит этот вывод:

/home/a/buildroot-2018.05/output/host/lib/gcc/arm-buildroot-linux-uclibcgnueabihf/6.4.0/../../../../arm-buildroot-linux-uclibcgnueabihf/bin/ld: cannot find -lgcc_s
/home/a/buildroot-2018.05/output/host/lib/gcc/arm-buildroot-linux-uclibcgnueabihf/6.4.0/../../../../arm-buildroot-linux-uclibcgnueabihf/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status

но в каталоге sysroot есть gcc_s.

~/buildroot-2018.05/output/host/arm-buildroot-linux-uclibcgnueabihf$ find ./ -name *gcc_s*

./sysroot/lib/libgcc_s.so
./sysroot/lib/libgcc_s.so.1
./sysroot/usr/include/boost/asio/detail/gcc_sync_fenced_block.hpp
./sysroot/usr/include/boost/atomic/detail/caps_gcc_sync.hpp
./sysroot/usr/include/boost/atomic/detail/ops_gcc_sync.hpp
./sysroot/usr/include/boost/atomic/detail/ops_gcc_sparc.hpp
./sysroot/usr/include/boost/atomic/detail/caps_gcc_sparc.hpp
./sysroot/usr/include/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp
./lib/libgcc_s.so
./lib/libgcc_s.so.1

Я предполагаю, что упускаю что-то важное в кросс-компиляции. В общем, у меня есть 3 вопроса:

  • Можете ли вы предложить некоторые ресурсы о кросс-компиляции для встраиваемых устройств?
  • Как скомпилировать cpp-netlib?
  • Как связать уже скомпилированный librpc?

1 ответ

Решение

На самом деле buildroot поддерживает сборку статических библиотек.
Шаги для создания пользовательской библиотеки с использованием buildroot:

  1. Создайте папку внутри папки buildroot / package с именем целевой библиотеки. например, мой путь выглядит следующим образом /home/a/buildroot-2018.05/package/rpclib
  2. Создайте файл Config.in в целевой библиотеке dir с необходимыми параметрами, которые можно проверить в руководстве по buildroot или лучше
  3. Создать [имя-пакета].mk
  4. Затем добавьте запись в /buildroot/package/Config.in
  5. Затем пакет может быть помечен для установки в menuconfig / target pacckages

Мой файл Config.in для rpclib

config BR2_PACKAGE_RPCLIB
bool "rpclib"
depends on BR2_INSTALL_LIBSTDCPP
depends on BR2_USE_WCHAR
help
  rpclib is a modern C++ msgpack-RPC server and client library

  http://rpclib.net

Мой файл rpclib.mk

RPCLIB_VERSION = v2.2.1
RPCLIB_SITE = $(call github,rpclib,rpclib,$(RPCLIB_VERSION))
RPCLIB_INSTALL_STAGING = YES
RPCLIB_INSTALL_TARGET = NO
RPCLIB_CONF_OPTS = -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF

$(eval $(cmake-package))

И запись в Config.in в директории buildroot / packages

source "package/rpclib/Config.in"

После выполнения make я получил

./output/host/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/librpc.a

Работая в своем маленьком ритле ( https://gitlab.com/melviso1/beatle), у меня есть собственный make-файл для сборки rpclib без использования cmake (я извиняюсь, но я действительно ненавижу cmake и подобные инструменты). Может быть, это может помочь. Поместите его в корень rpclib для сборки, очистки или установки. Пожалуйста, просмотрите вкладки в следующем скрипте, потому что мое вставление может привести к некоторым потерям. Я использовал это для компиляции rpclib внутри руки. Для кросс-компиляции вы можете редактировать и изменять инструменты сборки.

CXXFLAGS=-std=c++0x -O3 -pthread -DASIO_STANDALONE -DRPCLIB_ASIO=clmdep_asio -DRPCLIB_FMT=clmdep_fmt -DRPCLIB_MSGPACK=clmdep_msgpack -Wall 

INCLUDE=-Iinclude -I./dependencies/include

OBJS=obj/format.o obj/posix.o obj/client.o obj/client_error.o obj/response.o obj/server_session.o obj/dispatcher.o obj/optional.o obj/rpc_error.o obj/server.o obj/this_handler.o obj/this_server.o obj/this_session.o

all: obj librpc.a

obj:
    mkdir -p obj

librpc.a: $(OBJS)
    ar -r -s librpc.a $(OBJS)

obj/format.o: dependencies/src/format.cc
    g++ $(CXXFLAGS) $(INCLUDE) -c ./dependencies/src/format.cc -o     obj/format.o

obj/posix.o: dependencies/src/posix.cc
g++ $(CXXFLAGS) $(INCLUDE) -c ./dependencies/src/posix.cc -o obj/posix.o

obj/client.o: lib/rpc/client.cc
g++ $(CXXFLAGS) $(INCLUDE) -c ./lib/rpc/client.cc -o obj/client.o

obj/client_error.o: lib/rpc/detail/client_error.cc
g++ $(CXXFLAGS) $(INCLUDE) -c ./lib/rpc/detail/client_error.cc -o     obj/client_error.o

obj/response.o: lib/rpc/detail/response.cc
g++ $(CXXFLAGS) $(INCLUDE) -c ./lib/rpc/detail/response.cc -o obj/response.o

obj/server_session.o: lib/rpc/detail/server_session.cc
g++ $(CXXFLAGS) $(INCLUDE) -c ./lib/rpc/detail/server_session.cc -o     obj/server_session.o

obj/dispatcher.o: lib/rpc/dispatcher.cc
g++ $(CXXFLAGS) $(INCLUDE) -c ./lib/rpc/dispatcher.cc -o obj/dispatcher.o

obj/optional.o: lib/rpc/nonstd/optional.cc
g++ $(CXXFLAGS) $(INCLUDE) -c $< -o $@

obj/rpc_error.o: lib/rpc/rpc_error.cc
g++ $(CXXFLAGS) $(INCLUDE) -c $< -o $@

obj/server.o: lib/rpc/server.cc
g++ $(CXXFLAGS) $(INCLUDE) -c $< -o $@

obj/this_handler.o: ./lib/rpc/this_handler.cc
g++ $(CXXFLAGS) $(INCLUDE) -c $< -o $@

obj/this_server.o: lib/rpc/this_server.cc
g++ $(CXXFLAGS) $(INCLUDE) -c $< -o $@

obj/this_session.o: ./lib/rpc/this_session.cc
g++ $(CXXFLAGS) $(INCLUDE) -c $< -o $@

install:
    cp -rf include/rpc /usr/local/include/
    cp librpc.a /usr/local/lib/

uninstall:
    rm -rf /usr/local/include/rpc
    rm /usr/local/lib/librpc.a

clean:
    rm -f librpc.a
    rm -f obj/*

.PHONY: obj clean install uninstall`
Другие вопросы по тегам