1

我试图为 ARM 设备静态编译cpp-netlibrpclib 。(与 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)

在 cmake 创建 Makefile 后,我运行 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?
4

2 回答 2

0

实际上 buildroot 支持构建静态库。
使用 buildroot 构建自定义库的步骤:

  1. 使用目标库的名称在 buildroot/package 文件夹中创建一个文件夹。例如我的路径看起来像这样/home/a/buildroot-2018.05/package/rpclib
  2. 使用需要的参数在目标库目录中创建Config.in文件,这些参数可以在buildroot 手册中检查或更好
  3. 创建 [包名].mk
  4. 然后在 /buildroot/package/Config.in 中添加条目
  5. 然后可以在 menuconfig/target 包中标记包进行安装

我用于 rpclib 的 Config.in 文件

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

并在 buildroot/packages 目录中进入 Config.in

source "package/rpclib/Config.in"

执行make后我收到了

./output/host/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/librpc.a
于 2018-08-08T12:22:44.160 回答
0

在我的小披头士 ( https://gitlab.com/melviso1/beatle ) 中工作,我有一个自定义的 makefile,用于在不使用 cmake 的情况下构建 rpclib(我很抱歉,但我真的很讨厌 cmake 和类似的工具)。也许这会有所帮助。将它放在 rpclib 的根目录中,用于构建、清理或安装。请查看以下脚本中的选项卡,因为我在此处粘贴可能会造成一些损失。我用它在 arm 中编译 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`
于 2019-01-15T12:07:38.837 回答