netconf2在linux下的完整交叉编译步骤
此文介绍libnetconf2在Ubuntu下使用龙芯编译工具链进行libnetconf2的交叉编译流程,包含了libnetconf2所需依赖库的交叉编译,以及所需依赖库的依赖的交叉编译。
目前示例的是静态库的完整交叉编译流程,如果需要编译成其他形式,可以参照文章:linux下使用交叉编译工具链编译libnetconf2-CSDN博客,自行编译成想要的形式。
lib库下载地址
由于netconf2交叉编译需要必须依赖libyang,libssh,OpenSSL或者MdbedTLS,curl,同时libyang又需要依赖libpcre2,libssh又需要依赖OpenSSL和zlib,所以libnetconf2必须要用到的lib库一共有6个,包含libnetconf2本身,一共7个库需要进行交叉编译,下面给出所有lib库的下载地址。
openssl下载地址:下载 |OpenSSL 库
zlib下载地址:Index of /fossils
libssh下载地址:Index of /files
pcre2下载地址:https://github.com/PCRE2Project/pcre2/releases
libyang下载地址:https://github.com/CESNET/libyang/releases
curl下载地址:https://github.com/curl/curl/releases
netconf2下载地址:https://github.com/CESNET/libnetconf2/releases
示例下载的各个版本如下:
libcurlb版本: curl-8.18.0.tar.gz libnetconf2b版本: libnetconf2-4.1.2.tar.gz libsshb版本: libssh-0.11.3.tar.xz libyangb版本: libyang-4.2.2.tar.gz openssl版本: openssl-3.6.0.tar.gz pcre2版本: pcre2-10.47.tar.gz zlib版本: zlib-1.3.tar.gz下载后解压所有版本:
tar-zxvfcurl-8.18.0.tar.gztar-zxvflibnetconf2-4.1.2.tar.gztar-xvflibssh-0.11.3.tar.xztar-zxvflibyang-4.2.2.tar.gztar-zxvfopenssl-3.6.0.tar.gztar-zxvfpcre2-10.47.tar.gztar-zxvfzlib-1.3.tar.gz编译步骤
使用的编译平台:Ubuntu (注意Ubuntu 需要带有make cmake工具)
交叉编译工具链:loongarch64-unknown-linux-gnu
编译工具链路径:/opt/loongson-gnu-toolchain-13.2/bin
编译生成的库安装路径:/root/workspace/lib_libary/dep_libs
定义变量全局保存路径:
DEPS_BASE=/root/workspace/lib_libary/dep_libsTOOLCHAIN_BIN=/opt/loongson-gnu-toolchain-13.2/bin/loongarch64-unknown-linux-gnu编译openssl
进入openssl源码所在目录,执行以下指令:
#执行此句是利用config文件生成Makefile,后同,不在强调./Configure linux64-loongarch64 --cross-compile-prefix=${TOOLCHAIN_BIN}---prefix=${DEPS_BASE}/openssl no-shared no-dso#使用生成的Makefile对源码进行编译make&&makeinstall编译zlib
进入zlib源码所在目录,执行以下指令:
#创建build目录并进入build目录mkdir-pbuild&&cdbuild#使用cmake生成Makefile以及其他编译源码需要用到的文件cmake..-DCMAKE_INSTALL_PREFIX=${DEPS_BASE}/zlib-DCMAKE_C_COMPILER=${TOOLCHAIN_BIN}-gcc-DCMAKE_AR=${TOOLCHAIN_BIN}-ar-DBUILD_SHARED_LIBS=OFF-DCMAKE_SYSTEM_NAME=Linux-DCMAKE_SYSTEM_PROCESSOR=loongarch64make&&makeinstall编译libssh
进入libssh源码所在目录,执行以下指令:
mkdir-pbuild&&cdbuild cmake..-DCMAKE_C_COMPILER=${TOOLCHAIN_BIN}-gcc\-DCMAKE_INSTALL_PREFIX=${DEPS_BASE}/libssh\-DCMAKE_BUILD_TYPE=Release\-DBUILD_SHARED_LIBS=OFF\-DWITH_SERVER=ON\-DWITH_PCAP=OFF\-DWITH_EXAMPLES=OFF\-DWITH_NACL=OFF\-DWITH_GSSAPI=OFF\-DWITH_DEBUG_CALLTRACE=OFF\-DOPENSSL_ROOT_DIR=${DEPS_BASE}/openssl\-DOPENSSL_INCLUDE_DIR=${DEPS_BASE}/openssl/include\-DOPENSSL_CRYPTO_LIBRARY=${DEPS_BASE}/openssl/lib/libcrypto.a\-DOPENSSL_SSL_LIBRARY=${DEPS_BASE}/openssl/lib/libssl.a\-DZLIB_ROOT=${DEPS_BASE}/zlib\-DZLIB_INCLUDE_DIR=${DEPS_BASE}/zlib/include\-DZLIB_LIBRARY=${DEPS_BASE}/zlib/lib/libz.amake&&makeinstall编译libpcre2
进入pcre2源码所在目录,执行以下指令:
./configure--host=loongarch64-unknown-linux-gnu--prefix=${DEPS_BASE}/pcre2CC=${TOOLCHAIN_BIN}-gcc --disable-sharedmake&&makeinstall编译libyang
进入libyang源码所在目录,执行以下指令:
mkdir-pbuild&&cdbuild cmake..-DCMAKE_C_COMPILER=${TOOLCHAIN_BIN}-gcc\-DCMAKE_INSTALL_PREFIX=${DEPS_BASE}/libyang\-DCMAKE_BUILD_TYPE=Release-DBUILD_SHARED_LIBS=OFF\-DPCRE2_INCLUDE_DIR=${DEPS_BASE}/pcre2/include\-DPCRE2_LIBRARY=${DEPS_BASE}/pcre2/lib/libpcre2-8.a\-DCMAKE_FIND_ROOT_PATH=${DEPS_BASE}/pcre2make&&makeinstall编译libcurl
进入curl源码所在目录,执行以下指令:
CPPFLAGS="-I${DEPS_BASE}/openssl/include -I${DEPS_BASE}/zlib/include"\LDFLAGS="-L${DEPS_BASE}/openssl/lib -L${DEPS_BASE}/zlib/lib"\CC=${TOOLCHAIN_BIN}-gcc\./configure\--host=loongarch64-unknown-linux-gnu\--prefix=${DEPS_BASE}/curl\--with-openssl\--with-zlib\--without-libpsl\--without-libidn2\--without-librtmp\--without-zstd\--without-nghttp2\--without-nghttp3\--disable-shared\--disable-ldap\--disable-ldaps\--disable-rtsp\--disable-proxy\--disable-dict\--disable-telnet\--disable-tftp\--disable-pop3\--disable-imap\--disable-smb\--disable-smtp\--disable-gopher\--disable-manual\--disable-libcurl-optionmake&&makeinstall编译libnetconf2
进入libnetconf2源码所在目录,执行以下指令:
mkdir-pbuild&&cdbuild cmake..\-DCMAKE_C_COMPILER=${TOOLCHAIN_BIN}-gcc\-DCMAKE_INSTALL_PREFIX=${DEPS_BASE}/libnetconf2\-DCMAKE_BUILD_TYPE=Release\-DBUILD_SHARED_LIBS=OFF\-DCMAKE_FIND_ROOT_PATH=${DEPS_BASE}\-DCMAKE_C_FLAGS="-I${DEPS_BASE}/pcre2/include -I${DEPS_BASE}/zlib/include -I${DEPS_BASE}/openssl/include -I${DEPS_BASE}/libssh/include -I${DEPS_BASE}/curl/include -I${DEPS_BASE}/libyang/include"\-DCMAKE_EXE_LINKER_FLAGS="-L${DEPS_BASE}/pcre2/lib -L${DEPS_BASE}/zlib/lib -L${DEPS_BASE}/openssl/lib -L${DEPS_BASE}/libssh/lib -L${DEPS_BASE}/curl/lib -L${DEPS_BASE}/libyang/lib -Wl,--start-group -lssh -lcurl -lssl -lcrypto -lyang -lpcre2-8 -lz -Wl,--end-group -ldl -lpthread -lm"\-DLIBSSH_INCLUDE_DIR=${DEPS_BASE}/libssh/include\-DLIBSSH_LIBRARY=${DEPS_BASE}/libssh/lib/libssh.a\-DCURL_INCLUDE_DIR=${DEPS_BASE}/curl/include\-DCURL_LIBRARY=${DEPS_BASE}/curl/lib/libcurl.a\-DLIBYANG_INCLUDE_DIR=${DEPS_BASE}/libyang/include\-DLIBYANG_LIBRARY=${DEPS_BASE}/libyang/lib/libyang.a\-DPCRE2_INCLUDE_DIR=${DEPS_BASE}/pcre2/include\-DPCRE2_LIBRARY=${DEPS_BASE}/pcre2/lib/libpcre2-8.a\-DOPENSSL_ROOT_DIR=${DEPS_BASE}/openssl\-DOPENSSL_SSL_LIBRARY=${DEPS_BASE}/openssl/lib/libssl.a\-DOPENSSL_CRYPTO_LIBRARY=${DEPS_BASE}/openssl/lib/libcrypto.amake&&makeinstall为了解决编译示例程序client可能出现的报错,找到libnetconf2目录下的
./examples/CMakeLists.txt文件,在其中找到类似如下行:add_executable(${app_name}${app_name}.c)target_link_libraries(${app_name}netconf2)通过修改生成的client程序需要的库,将需要依赖的库强制链接,注意链接顺序,因为库之间有依赖关系,所以如下修改即可:
add_executable(${app_name}${app_name}.c)target_link_libraries(${app_name}netconf2${CURL_LIBRARY}${LIBSSH_LIBRARY}${OPENSSL_SSL_LIBRARY}${OPENSSL_CRYPTO_LIBRARY}${ZLIB_LIBRARY}${LIBYANG_LIBRARY}${PCRE2_LIBRARY}dl pthread m)在执行cmake的时候也可能如下报错:
-- Lookingforstdatomic.h - found CMake Error at CMakeModules/UseCompat.cmake:106(list): list sub-command REMOVE_ITEM requires two ormorearguments. Call Stack(most recent call first): CMakeLists.txt:213(use_compat)通过修改libnetconf2目录下的
./CMakeModules/UseCompat.cmake文件,根据报错提示在106行,传入的参数需要两个参数,查看此文件的106行:list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})其中REMOVE_ITEM需要两个参数,这里也确实是两个参数,但是为什么还有此报错呢?这说明其中一个参数可能为空,所以加上一个为空的判断,修改方式如下:
if(CMAKE_THREAD_LIBS_INIT AND CMAKE_REQUIRED_LIBRARIES) list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) endif()
编译完成
最终如果无任何报错的话,编译完成后需要的libconf2.a文件就在安装/root/workspace/lib_libary/dep_libslibnetconf2/lib目录下,其中有我们需要的libnetconf2.a文件。
如果需要示例的可执行程序client和server,在源码中我们创建的./build/examples目录下,此目录中有client和server可执行程序,可以使用这两个程序在目标设备是试运行,看看交叉编译是否成功。