
netconf2在linux下的完整交叉编译步骤此文介绍libnetconf2在Ubuntu下使用龙芯编译工具链进行libnetconf2的交叉编译流程包含了libnetconf2所需依赖库的交叉编译以及所需依赖库的依赖的交叉编译。目前示例的是静态库的完整交叉编译流程如果需要编译成其他形式可以参照文章linux下使用交叉编译工具链编译libnetconf2-CSDN博客自行编译成想要的形式。lib库下载地址由于netconf2交叉编译需要必须依赖libyanglibsshOpenSSL或者MdbedTLScurl同时libyang又需要依赖libpcre2libssh又需要依赖OpenSSL和zlib所以libnetconf2必须要用到的lib库一共有6个包含libnetconf2本身一共7个库需要进行交叉编译下面给出所有lib库的下载地址。openssl下载地址下载 |OpenSSL 库zlib下载地址Index of /fossilslibssh下载地址Index of /filespcre2下载地址https://github.com/PCRE2Project/pcre2/releaseslibyang下载地址https://github.com/CESNET/libyang/releasescurl下载地址https://github.com/curl/curl/releasesnetconf2下载地址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对源码进行编译makemakeinstall编译zlib进入zlib源码所在目录执行以下指令#创建build目录并进入build目录mkdir-pbuildcdbuild#使用cmake生成Makefile以及其他编译源码需要用到的文件cmake..-DCMAKE_INSTALL_PREFIX${DEPS_BASE}/zlib-DCMAKE_C_COMPILER${TOOLCHAIN_BIN}-gcc-DCMAKE_AR${TOOLCHAIN_BIN}-ar-DBUILD_SHARED_LIBSOFF-DCMAKE_SYSTEM_NAMELinux-DCMAKE_SYSTEM_PROCESSORloongarch64makemakeinstall编译libssh进入libssh源码所在目录执行以下指令mkdir-pbuildcdbuild cmake..-DCMAKE_C_COMPILER${TOOLCHAIN_BIN}-gcc\-DCMAKE_INSTALL_PREFIX${DEPS_BASE}/libssh\-DCMAKE_BUILD_TYPERelease\-DBUILD_SHARED_LIBSOFF\-DWITH_SERVERON\-DWITH_PCAPOFF\-DWITH_EXAMPLESOFF\-DWITH_NACLOFF\-DWITH_GSSAPIOFF\-DWITH_DEBUG_CALLTRACEOFF\-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.amakemakeinstall编译libpcre2进入pcre2源码所在目录执行以下指令./configure--hostloongarch64-unknown-linux-gnu--prefix${DEPS_BASE}/pcre2CC${TOOLCHAIN_BIN}-gcc --disable-sharedmakemakeinstall编译libyang进入libyang源码所在目录执行以下指令mkdir-pbuildcdbuild cmake..-DCMAKE_C_COMPILER${TOOLCHAIN_BIN}-gcc\-DCMAKE_INSTALL_PREFIX${DEPS_BASE}/libyang\-DCMAKE_BUILD_TYPERelease-DBUILD_SHARED_LIBSOFF\-DPCRE2_INCLUDE_DIR${DEPS_BASE}/pcre2/include\-DPCRE2_LIBRARY${DEPS_BASE}/pcre2/lib/libpcre2-8.a\-DCMAKE_FIND_ROOT_PATH${DEPS_BASE}/pcre2makemakeinstall编译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\--hostloongarch64-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-optionmakemakeinstall编译libnetconf2进入libnetconf2源码所在目录,执行以下指令mkdir-pbuildcdbuild cmake..\-DCMAKE_C_COMPILER${TOOLCHAIN_BIN}-gcc\-DCMAKE_INSTALL_PREFIX${DEPS_BASE}/libnetconf2\-DCMAKE_BUILD_TYPERelease\-DBUILD_SHARED_LIBSOFF\-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.amakemakeinstall为了解决编译示例程序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可执行程序可以使用这两个程序在目标设备是试运行看看交叉编译是否成功。