1. 程式人生 > 實用技巧 >Lxd-4.0.2 在arm架構下原始碼編譯

Lxd-4.0.2 在arm架構下原始碼編譯

Lxd-4.0.2arm架構下原始碼編譯

1、安裝過程

1.環境:centos7.6-aarch64

2.安裝epel

yum -y install epel-release

3.安裝lxd依賴包

yum install acl autoconf dnsmasq-base git golang libacl1* libtool make rsync squashfs-tools tar tcl xz-utils ebtables

yum install -y glibc-static #編譯時需要的c

4.原始碼編譯一些依賴庫

由於arm版本的yum包給的會比較老,所以需要原始碼安裝以下

libcap-2.40libuv-v1.9.0 ,lxc-4.0.2,pkg-config-0.29

5.安裝lxd的庫依賴

cd lxd-4.0.2

export GOPATH=$(pwd)/_dist

export GOBIN=$GOPATH/bin

export PATH=$PATH:$GOBIN

make deps

將環境變數匯入到~/.bashrc

export CGO_CFLAGS="-I/root/lxd-4.0.2/_dist/deps/sqlite/ -I/root/lxd-4.0.2/_dist/deps/libco/ -I/root/lxd-4.0.2/_dist/deps/raft/include/ -I/root/lxd-4.0.2/_dist/deps/dqlite/include/
" export CGO_LDFLAGS="-L/root/lxd-4.0.2/_dist/deps/sqlite/.libs/ -L/root/lxd-4.0.2/_dist/deps/libco/ -L/root/lxd-4.0.2/_dist/deps/raft/.libs -L/root/lxd-4.0.2/_dist/deps/dqlite/.libs/" export LD_LIBRARY_PATH="/root/lxd-1.0.2/_dist/deps/sqlite/.libs/:/root/lxd-4.0.2/_dist/deps/libco/:/root/lxd-4.0.2/_dist/deps/raft/.libs/:/root/lxd-4.0.2/_dist/deps/dqlite/.libs/
" export CGO_LDFLAGS_ALLOW="-Wl,-wrap,pthread_create"

Source ~/.bashrc

make

2、解決c的編譯依賴問題

1、make deps的時候會用到libuv1這個非同步io的庫,交叉編譯失敗也是此原因導致,需要再arm-gcc的環境下原始碼編譯一次libuv1

2、Lxc的安裝,yum安裝的lxc只有可執行檔案,沒有lib.so的庫,編譯lxd需要找到這些庫,比如:lxc.so.1,lxd啟動會呼叫的庫

3、Lxc原始碼編譯的時候,在/usr/include/linux/prctl.h已經定義了prctl_mm_map的結構體,所以需要在/root/lxc-lxc-4.0.2/src/lxc/initutils.h將此結構體註釋掉,然後再make

4、pkg-config --cflags -- lxc #no package #就是說找不到lxc.pc這個檔案,沒有支援pkg-config這個方法,原始碼安裝會解決這個問題

5、我的Arm環境下的gcc版本比較低,不支援c99標準,for迴圈i自增變數會報錯,我的編譯是此檔案報錯:

/root/lxd-4.0.2/lxd/include/memory_utils.h

解決方式,給自增變數先增加型別

static inline void free_string_list(char **list)

{

        if (list) {

                int i;

                for ( i = 0; list[i]; i++)

                        free(list[i]);

                free_disarm(list);

        }

}

3、解決lxd的依賴問題

至此,基本問題已解決,在lxd目錄下執行make

然後等了一會我的程序被殺掉了,檢視原因,發現是記憶體不足導致的,之後增加記憶體進行再次編譯

成功編譯出二進位制檔案

cd ${GOPATH}/bin目錄下,執行./lxd

報錯,找不到liblxc.so

Liblxc.solibuv.so這些make install時都會安裝再/usr/local/lib下,解決方法:

cd /etc/ld.so.conf.d/

vim lxc-aarch64.conf 新增

/usr/local/lib

執行ldconfig

交叉編譯需要先安裝交叉編譯的gcc工具,改過好多問題,未編譯成功,有大佬交叉編譯成功,歡迎留言 觀摩一番