CentOS下交叉编译Windows N2N服务端及客户端

Linux, N2N, 折腾 2018/04/13

记录一下N2N Linux下的服务端、客户端,以及在CentOS下交叉编译Windows版本的N2N。

这里使用的是n2n的一个分支,有v1和v2两个版本,以v2版本为例,编译过程均基于CentOS 7 64bits

其他系统参阅:https://github.com/meyerd/n2n/wiki/Compilation

此文已过于陈旧,不推荐使用此版本N2N

Linux

yum install cmake make openssl openssl-devel gcc-c++ git -y
git clone https://github.com/meyerd/n2n.git
cd n2n/n2n_v2
cmake ./
make && make install

查看版本

Windows

在CentOS 64bits下交叉编译Windows版本稍微有些复杂,关键步骤也就那几步

#安装环境
yum install mingw64-gcc-c++.x86_64 cmake openssl openssl-devel gcc-c++ git make -y
git clone https://github.com/meyerd/n2n.git

git源码到本地之后,需要做一些小调整,否则有各种问题。

还是以v2版本为例,先将v2的源码移动到上级目录,然后返回到n2n目录

cd n2n/n2n_v2
mv * ..
cd ..

修改cmake/CMakeToolchainFileMingw32.cmake文件,将原有的i686-mingw32-gcc两行替换为:

SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)

接着在n2n目录下新建编译文件夹build,开始编译

mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/CMakeToolchainFileMingw32.cmake --build ./ ../
make

等待编译完成后,build目录下就有Windows版的客户端(edge.exe)及服务端(supernode.exe)

已编译好的Windows程序:

https://file.bugxia.com/s/b6MAp6LS78b6XBp

压缩包中包含了v1、v2版本的客户端和服务端,还有客户端需要安装的虚拟网卡TapV9

 



46条评论

  • admlnos 评论于 回复

    使用Cmake的时候出现这个
    CMake Error: CMake was unable to find a build program corresponding to “Unix Makefiles”. CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
    CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
    CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage

    • Bug侠 评论于 回复

      @admlnos
      看提示只能看出是编译器没安装
      检查一下,编译所需的环境确定一样别落下
      yum install mingw64-gcc-c++.x86_64 cmake openssl openssl-devel gcc-c++ git -y

      • admlnos 评论于 回复

        @Bug侠
        你在yum这段里再加个make就可以解决了,改一下教程文档吧

      • admlnos 评论于 回复

        @Bug侠
        yum installmingw64- gcc- c++.x86_64 cmake openssl openssl- devel gcc- c++ git make – y这样就不会出问题了

      • admlnos 评论于 回复

        @Bug侠
        我是直接复制你的指令才会出现这个问题

        • Bug侠 评论于 回复

          @admlnos
          得看你那边的情况,比如执行yum是什么结果呢?有没有报什么错呢?

          • admlnos 评论于 回复

            @Bug侠
            没有报错估计是centos8的锅

        • Bug侠 评论于 回复

          @admlnos
          好吧,才看到之前你还有回复~不好意思啊

  • 三杯两盏淡酒 评论于 回复

    大佬,现在n2n,使用的https://github.com/ntop/n2n 这个仓库,有没有这个的多平台安装呢?谢谢

  • Noob 评论于 回复

    n2n的git炸了

  • he 评论于 回复

    难搞,大佬能帮帮忙看看么
    cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/CMakeToolchainFileMingw32.cmake –build ./ ../ — The C compiler identification is GNU 4.9.3 — The CXX compiler identification is GNU 4.9.3 — Check for working C compiler: /usr/bin/x86_64-w64-mingw32-gcc– Check for working C compiler: /usr/bin/x86_64-w64-mingw32-gcc — works — Detecting C compiler ABI info — Detecting C compiler ABI info – done — Detecting C compile features — Detecting C compile features – done — Check for working CXX compiler: /usr/bin/x86_64-w64-mingw32-g++ — Check for working CXX compiler: /usr/bin/x86_64-w64-mingw32-g++ — works — Detecting CXX compiler ABI info — Detecting CXX compiler ABI info – done — Detecting CXX compile features — Detecting CXX compile features – done — Configuring done — Generating done — Build files have been written to: /root/n2n/build

    In file included from /root/n2n/win32/wintap.c:5:0: /root/n2n/win32/../n2n.h:64:19: fatal error: netdb.h: No such file or directory #include

    build git:(master) ✗ cat ../cmake/CMakeToolchainFileMingw32.cmake # the name of the target operating system SET(CMAKE_SYSTEM_NAME Windows) # which compilers to use for C and C++ #SET(CMAKE_C_COMPILER i686-mingw32-gcc) #SET(CMAKE_CXX_COMPILER i686-mingw32-g++) SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) # here is the target environment located SET(CMAKE_FIND_ROOT_PATH ${HOME}/usr/x86_64-w64-mingw32/bin) # adjust the default behaviour of the FIND_XXX() commands: # search headers and libraries in the target environment, search # programs in the host environment #set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) #set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) #set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

      • Bug侠 评论于 回复

        @he
        【fatal error: netdb.h: No such file or directory】
        找不到netdb.h这个头文件
        —————
        我也没遇到过这问题,估计是C编译器哪一块的问题,有人说安装ibc6-dev即可解决
        我这边没法测试,你再找找方法

      • Bug侠 评论于 回复

        @he
        实在不行,windows下的编译方法:https://bugxia.com/611.html :咧嘴:

  • 安抚 评论于 回复

    大佬,我又来了。我按你的教程用ubuntu编译了一个WIN的客户端和服务端,然后把,服务端挂在了一个win2008的服务器上。但是我发现,实际使用中客户端老是出ERROR: recvfrom failed with No error。不久后,服务器上的supernode也出了个类似的错误 然后挂掉了- – 是supernode挂在WIN上不稳定?还是我编译出了什么差错?请问有什么好的建议么?

    • 安抚 评论于 回复

      @安抚
      是不是V2S跟win10 1803有冲突? 我试着用了新的N2N版本 好像就不会有这个 错误了,或者只是不显示

    • Bug侠 评论于 回复

      @安抚
      这个错误之前在https://bugxia.com/475.html下回复你了,如果是Win服务器的话,有可能是防火墙没放行UDP包导致的,检查一下防火墙对supernode的放行设置

    • Bug侠 评论于 回复

      @felice
      :汗: 什么服务器?

  • lucktu 评论于 回复

    博主,我在搬瓦工上,完全按照你的方法编辑windows下的n2n时,进行到cmake时,出现如下错误:
    — The C compiler identification is unknown
    — The CXX compiler identification is unknown
    — Check for working C compiler: x86_64-w64-mingw32-gcc
    CMake Error: your C compiler: “x86_64-w64-mingw32-gcc” was not found.
    … …

    缺少一些东西,所以没有进行完成。

    不知博主可否编辑这里的n2n-v2?这个是官方的,最近刚更新成2.5版本,与这里版本(我们叫他v2s)是不兼容的。
    https://github.com/ntop/n2n

    • Bug侠 评论于 回复

      @lucktu
      嗯,看错误日志大致意思是x86_64-w64-mingw32-gcc编译器没有找到,应该是安装过程中出了什么问题。这个得具体看,没法远程分析。
      我都没怎么关注,官方居然出了新的,我这就去研究研究。

  • 欧阳 评论于 回复

    第一条命令可以用这个“yum install cmake openssl openssl-devel gcc-c++ git -y”

    • Bug侠 评论于 回复

      @欧阳
      感谢感谢,因为本来有git和gcc,所以根本没注意到。 :咧嘴:

      • 欧阳 评论于 回复

        @Bug侠
        我感觉应该+上防火墙添加端口的方法 :二哈: 我就为了防火墙折腾了好久 :笑哭:

        • Bug侠 评论于 回复

          @欧阳
          呃……我都是在非生产环境下测试的,所以一上来第一件事就是关闭iptables关闭firewall。也是忽略了这个问题。一会儿就去加上。 :咧嘴:

  • 冰皇 评论于 回复

    无限错误提示!怎么解决?

  • 冰皇 评论于 回复

    edge_v2.exe -a 192.168.100.100 -c bugxia -k 123456 -l 88.88.88.88:3456
    中间这段192.168.100.100每个人必须一样吗?还是不能一样

    • Bug侠 评论于 回复

      @冰皇
      每个人的ip地址需要不一样,一样就冲突了

      • 冰皇 评论于 回复

        @Bug侠
        怎么写才能让他随机分配

    • Bug侠 评论于 回复

      @冰皇
      客户端随机分配,易语言取随机数()

      • 冰皇 评论于 回复

        @Bug侠
        emmmm最高255的IP地址,怎么设置?话说必须在同一网段才能联机么,192.168.100.x,x取随机数的话要怎么写。。。。,我已经把你的源码拆到我的源码上了,写个重启,然后分配吗?可是这个随机数不会写,因为X在尾部

    • Bug侠 评论于 回复

      @冰皇
      同段才可以互通。取随机数(1,255)

      • 冰皇 评论于 回复

        @Bug侠
        能不能上线帮我一下,我就缺这个了 :害羞:

    • Bug侠 评论于 回复

      @冰皇
      我上线了

      • 冰皇 评论于 回复

        @Bug侠
        找到问题了,是你的隐藏窗口代码问题

        • Bug侠 评论于 回复

          @冰皇
          找到就好

          • 冰皇 评论于 回复

            @Bug侠
            可是把你代码删了,edge.exe就不会出现在进程里面了,上线看看

          • 冰皇 评论于 回复

            @Bug侠
            写得我的魂都快飞了,终于搞定了

          • 冰皇 评论于 回复

            @Bug侠
            还有件事,想请你帮忙,我留言给QQ了

  • 冰皇 评论于 回复

    执行cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/CMakeToolchainFileMingw32.cmake –build ./ ../怎么出现错误?

    • Bug侠 评论于 回复

      @冰皇
      报什么错?

      • 冰皇 评论于 回复

        @Bug侠
        留下你的邮箱地址,我截图给你看

      • 冰皇 评论于 回复

        @Bug侠
        已经发送到系统邮箱了,麻烦了

      • 冰皇 评论于 回复

        @Bug侠
        错误(10002): 指定子程序或类方法名称“创建图标”未找到。

      • 冰皇 评论于 回复

        @Bug侠
        请问每个人的虚拟地址必须一样吗?

    评论(本站已开启评论回复邮件通知功能,请如实填写邮箱以便及时收到回复)关闭回复