Nick Kashkin
Nick Kashkin

Reputation: 45

How to build static library .a for ARM using cross compiler?

I was trying to compile statically cpp-netlib and rpclib for ARM device.(Same as ZEDboard)

Everything i did is changed the compiler and system settings in CMakeLists.txt file.

    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)

After Makefile is created by cmake i ran make and no output has been produced. As i understand build directories should appear.

For the rpclib things went better. It has compiled the librpc.a file but unftunately its not linking to my program.

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

produces this output:

/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

but there is gcc_s in the sysroot directory.

~/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

I guess i am missing something important about cross-compilation. So basically i have 3 questions:

Upvotes: 1

Views: 3870

Answers (2)

Mel Viso Martinez
Mel Viso Martinez

Reputation: 658

Working in my little beatle (https://gitlab.com/melviso1/beatle) I have a custom makefile for building rpclib without using cmake stuff (I apologize but I really hate cmake and similar tools). Maybe that can help. Put it in the root of rpclib for building, clean or install. Please review tabs in the following script, because my pasting here can make some loses. I used this to compile rpclib inside arm. For cross-compiling you could edit and change build tools.

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`

Upvotes: 0

Nick Kashkin
Nick Kashkin

Reputation: 45

Actually buildroot supports building static libraries.
Steps to build a custom library using buildroot:

  1. Create a folder inside buildroot/package folder with the name of target library. e.g. my path looks like this /home/a/buildroot-2018.05/package/rpclib
  2. Create Config.in file in target library dir with the needed parameters which can be checked in buildroot manual or better
  3. Create [package-name].mk
  4. Then add entry in /buildroot/package/Config.in
  5. Then package can be marked for installation in menuconfig/target pacckages

My Config.in file for 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

My rpclib.mk file

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))

And entry in Config.in in the buildroot/packages dir

source "package/rpclib/Config.in"

After executing make i received

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

Upvotes: 0

Related Questions