news 2026/7/21 10:33:04

linux使用交叉编译完整编译libnetconf2全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux使用交叉编译完整编译libnetconf2全流程

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
  1. 编译openssl

    进入openssl源码所在目录,执行以下指令:

    #执行此句是利用config文件生成Makefile,后同,不在强调./Configure linux64-loongarch64 --cross-compile-prefix=${TOOLCHAIN_BIN}---prefix=${DEPS_BASE}/openssl no-shared no-dso#使用生成的Makefile对源码进行编译make&&makeinstall
  2. 编译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
  3. 编译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
  4. 编译libpcre2

    进入pcre2源码所在目录,执行以下指令:

    ./configure--host=loongarch64-unknown-linux-gnu--prefix=${DEPS_BASE}/pcre2CC=${TOOLCHAIN_BIN}-gcc --disable-sharedmake&&makeinstall
  5. 编译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
  6. 编译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
  7. 编译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目录下,此目录中有clientserver可执行程序,可以使用这两个程序在目标设备是试运行,看看交叉编译是否成功。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 10:32:50

嵌入式Flash性能优化:预取与缓存机制在C2000 DSP中的原理与应用

1. 嵌入式Flash性能优化的核心:为什么预取与缓存如此重要在嵌入式实时控制系统的开发中,尤其是像TI C2000系列DSP这样的高性能微控制器上,我们常常会面临一个核心矛盾:CPU的主频越来越高,指令执行速度越来越快&#xf…

作者头像 李华
网站建设 2026/7/21 10:32:01

深入解析McBSP多通道通信:从时分复用到DMA高效数据搬运

1. McBSP多通道通信:从物理链路到逻辑通道的跨越在嵌入式系统,尤其是数字信号处理器的世界里,高速、实时的数据交换是核心命脉。无论是专业音频设备中的多路音频流混合,还是电信基站里的时分复用信号处理,都需要一种机…

作者头像 李华
网站建设 2026/7/21 10:30:53

如何在Switch上自定义你的《塞尔达传说:旷野之息》存档体验

如何在Switch上自定义你的《塞尔达传说:旷野之息》存档体验 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 你是否曾经在《塞尔达传说:旷野…

作者头像 李华
网站建设 2026/7/21 10:27:49

Razor组件RDP协议优化与连接问题排查指南

1. Razor组件概述与核心特性 Razor是JumpServer在2022年6月推出的新一代RDP协议访问组件,作为原有XRDP组件的替代方案,它在协议兼容性和用户体验方面实现了显著提升。这个组件的设计初衷是为了解决传统XRDP组件在Windows远程桌面连接中存在的性能瓶颈和功…

作者头像 李华