Loading... <strong>本文介绍的是在普通centos服务器上编译路由器中的N2N。有以下几个步骤。</strong> <ol> <li>下载自己固件型号的SDK ,openssl源代码 ,n2n源码</li> <li>在centos上安装cmake</li> <li>修改openssl源代码中的makefile</li> <li>编译openssl后找到libcrypto.a为后面步骤使用</li> <li>修改n2n源码中的CMakeList.txt</li> <li>编译n2n</li> <li>把编译好的执行文件搬到路由器上</li> </ol> 首先介绍下我的路由器是newifi3 固件使用的是openwrt mips MT7621,接下来我就详细介绍下我的作法,希望带大家都能编译出自己路由器的n2n。 1. 在介绍前我得说一下你真的认识你的路由器固件么,你如何找到路由器适配的openwrt原厂刷机包呢。很简单打开网站https://openwrt.org/toh/views/toh_packagedownload 在 Model中搜索你的路由器型号,比如我的就搜newifi3,cpu型号版本啥的都会列出来,这是最简单的方法。那有些小伙伴可能固件已经装好但不知道自己固件型号怎么办?不要急,打开网站https://downloads.openwrt.org,选择你的固件版本,ssh到你的路由器,就能看到了你对应的版本了。我的是19.07。这时你就进到网站目录Index of (root) / releases / 19.07.3 / targets / 这个地方接下去还有两层要选,头疼啊。这该怎么看,登录路由器cat /proc/cpuinfo,找到cpu model对应的就是接下去的一层,system type对应的就是最后一层目录选择。比如我的cpu model :MIPS 1004Kc V2.15 system type:MediaTek MT7621 ver:1 eco:3 那我最后进入的目录就是Index of (root) / releases / 19.07.3 / targets / ramips / mt7621 / 进入之后找到SDK。openssl源码 ,n2n源码下载我就不多说了github上多的是。我分别是以下两个地方下载 https://www.openssl.org/source/ https://github.com/meyerd/n2n。 2.这个没啥好讲的 <pre class="pure-highlightjs"><code class="">yum -y install cmake make gcc gcc-c++</code></pre> 3. <pre class="pure-highlightjs"><code class="">./configure no-asm shared --prefix=/usr/local/mips</code></pre> 生成makefile后需要修改<code>CC</code>、<code>AR</code>、<code>RANLIB</code>、<code>NM</code>等路径,指向MISP编译器,SDK中就有我们所需要的编译器。假设 toolchain 路径为:/root/mips_1004kc_gcc/bin/mipsel-openwrt-linux-gcc 有些小伙伴可能不知道 toolchain,在SDK包中 OpenWrt-SDK-ramips-mt7621_gcc-5.3.0_musl-1.1.16.Linux-x86_64/staging_dir/toolchain-mipsel_1004kc+dsp_gcc-5.3.0_musl-1.1.16/ 就是toolchain。我之前把这个目录mv 到了root目录下了。 <pre class="prettyprint"><code class="language-MakeFile hljs makefile has-numbering"><span class="hljs-comment"># 1、修改CC</span> <span class="hljs-constant">CC</span>= /root/mips_1004kc_gcc/bin/mipsel-openwrt-linux-gcc <span class="hljs-constant">CFLAG</span>= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -O3 -Wall <span class="hljs-constant">DEPFLAG</span>= -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_STORE -DOPENSSL_NO_UNIT_TEST <span class="hljs-constant">PEX_LIBS</span>= <span class="hljs-constant">EX_LIBS</span>= -ldl <span class="hljs-constant">EXE_EXT</span>= <span class="hljs-constant">ARFLAGS</span>= <span class="hljs-comment"># 2、修改AR</span> <span class="hljs-constant">AR</span>= /root/mips_1004kc_gcc/bin/mipsel-openwrt-linux-ar <span class="hljs-variable">$(ARFLAGS)</span> r <span class="hljs-comment"># 3、修改RANLIB</span> <span class="hljs-constant">RANLIB</span>= /root/mips_1004kc_gcc/bin/mipsel-openwrt-linux-ranlib <span class="hljs-comment"># 4、修改NM</span> <span class="hljs-constant">NM</span>= /root/mips_1004kc_gcc/bin/mipsel-openwrt-linux-nm <span class="hljs-constant">PERL</span>= /usr/bin/perl <span class="hljs-constant">TAR</span>= tar <span class="hljs-constant">TARFLAGS</span>= --no-recursion --record-size=10240 <span class="hljs-constant">MAKEDEPPROG</span>= gcc <span class="hljs-constant">LIBDIR</span>=lib <span class="hljs-comment"># 注释下面这一行</span> <span class="hljs-comment">#SHARED_LDFLAGS=-m64</span></code></pre> 如果是mips交叉编译,后仍需要将此 Makefile 文件中的<code>-m64</code>后缀全部去掉。在VIM环境下可以使用<code>/-m64</code>回车查找,然后按下<code>n</code>查找下一个,全文应该只有两处! 4. 没啥好讲的,make && make install 有错排错,都很好解决有问题留言。在<code class="">--prefix=/usr/local/mipsz</code> 指定的目录中找到libcrypto.a 放在你喜欢的地方。 5. 开头为<是旧文件中的 ,>为修改后新文件中的。1d0 代表原文件被删,2a2,10 表示新文件新增了2-10行。不懂的百度linux diff <pre class="pure-highlightjs"><code class="">[root@localhost ~]# diff /opt/n2n/CMakeLists.txt /root/n2n/CMakeLists.txt 1d0 < project(n2n) 2a2,10 > SET(CMAKE_SYSTEM_NAME Generic) > SET(CMAME_C_COMPILER /root/mips_1004kc_gcc/bin/mipsel-openwrt-linux-gcc) > SET(CMAKE_CXX_COMPILER /root/mips_1004kc_gcc/bin/mipsel-openwrt-linux-g++) > SET(CMAKE_FIND_ROOT_PATH /root/mips_1004kc_gcc) > SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) > SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) > SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) > > project(n2n) 95,97c103,111 < if(N2N_OPTION_AES) < target_link_libraries(n2n crypto) < endif(N2N_OPTION_AES) --- > #if(N2N_OPTION_AES) > #target_link_libraries(n2n crypto) > #endif(N2N_OPTION_AES) > > > add_library(mxnet STATIC IMPORTED) > set_property(TARGET mxnet PROPERTY IMPORTED_LOCATION /root/n2n/libcrypto.a) > target_link_libraries(n2n mxnet ) </code></pre> 6. 进入n2n目录,创建build文件夹 ,cd到build文件夹。 <pre class="pure-highlightjs"><code class="">export CC=/root/mips_1004kc_gcc/bin/mipsel-openwrt-linux-gcc export CXX=/root/mips_1004kc_gcc/bin/mipsel-openwrt-linux-g++ cmake .. make </code></pre> 恭喜编译结束拿走编译好的执行文件。 补充知识点:c语言一共多种文件格式 .c 和 .h --> .i --> .s --> .o --> .a 和 .so 编译顺序 代码源文件是.c 代码头文件.h 这两者进行第一次编译成 .i文件 汇编文件 .s 二进制文件.o 单个或多个.o 文件就可以组成 .a文件(静态链接库文件)或者.so文件(动态链接库文件可被多个程序链接共享使用)。 一般情况.h 头文件在incloud 目录下找 ,.a和.so 在lib目录下找。一般来说编译后.a 和.so 都会以libXXX.a 或libXXX.so 出现。 例如链接库文件crypto编译好以后就是libcrypto.a 或libcrypto.so。 cmakelist.txt 中的改动说明 <pre>#告知当前使用的是交叉编译方式,必须配置 SET(CMAKE_SYSTEM_NAME Linux) #指定编译工具,一定要设置 #或交叉编译器使用绝对地址 SET(CMAKE_C_COMPILER "arm-linux-gcc") #指定C++交叉编译器 SET(CMAKE_CXX_COMPILER "arm-linux-g++") #不一定需要设置 #指定交叉编译环境安装目录... SET(CMAKE_FIND_ROOT_PATH "...") #从来不在指定目录下查找工具程序 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) #只在指定目录下查找库文件 SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) #只在指定目录下查找头文件 SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) #引用静态库文件 <code class="">add_library(mxnet STATIC IMPORTED) set_property(TARGET mxnet PROPERTY IMPORTED_LOCATION /root/n2n/libcrypto.a) target_link_libraries(n2n mxnet ) #原cmakelist.txt中这么写的话就会CMAKE_FIND_ROOT_PATH的路径中更具ld链接信息找到crypto链接库并链接使用,所以为什么当自己系统上编译的时候能用,拿到别的系统中时候就会少依赖。 if(N2N_OPTION_AES) target_link_libraries(n2n crypto) endif(N2N_OPTION_AES)</code></pre> Last modification:June 3, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏