2、SOEM源码编译:Linux环境下的编译配置、Windows环境下的编译配置、常见编译错误解决

好,咱们进入正题。SOEM 拿到手,第一件事就是把它编译通过。别小看这一步,我见过不少新手卡在这里,一卡就是半天。其实说白了,编译环境配置就那么几个关键点,摸透了就顺了。

2.1 Linux 环境下的编译配置

我个人习惯在 Ubuntu 18.04/20.04 上做开发。SOEM 对 Linux 的支持很成熟,毕竟它最早就是跑在 Linux 上的。

第一步:安装依赖

你需要先装好 cmake 和 gcc。如果要用网卡抓包调试,还得装 libpcap-dev。命令很简单:

sudo apt-get update
sudo apt-get install build-essential cmake libpcap-dev

嗯,这里要注意,有些精简版系统可能没装 git,记得一并装上:

sudo apt-get install git

第二步:克隆源码并编译

从 GitHub 上把代码拉下来:

git clone https://github.com/OpenEtherCATsociety/SOEM.git
cd SOEM
mkdir build && cd build
cmake ..
make

我在项目中遇到过一个问题——cmake 时提示找不到 libpcap。当时我明明装了,后来发现是 64 位系统下 libpcap-dev 的库路径问题。解决办法是:

sudo apt-get install libpcap0.8-dev

这个包名在不同版本里有点差异,Ubuntu 18.04 和 20.04 就不太一样。你如果遇到类似问题,先检查一下包名。

第三步:编译选项说明

SOEM 的 CMakeLists.txt 里有一些开关,我个人常用的几个:

选项 说明 默认值
ENABLE_PCAP 启用 libpcap 抓包支持 ON
ENABLE_EOE 启用 Ethernet over EtherCAT ON
ENABLE_DEBUG 开启调试日志输出 OFF

调试阶段我建议把 ENABLE_DEBUG 打开:

cmake .. -DENABLE_DEBUG=ON
小技巧: 如果你在嵌入式板子上交叉编译,记得设置 CMAKE_TOOLCHAIN_FILE。我曾在 ARM 板子上折腾过,用交叉编译链直接搞定。

2.2 Windows 环境下的编译配置

Windows 下编译 SOEM,说实话比 Linux 麻烦一点。主要原因是 Windows 没有原生的 pcap 库,需要额外装 WinPcap 或 Npcap。

第一步:安装工具链

我推荐用 Visual Studio 2019 或 2022,社区版就够用。安装时记得勾选「使用 C++ 的桌面开发」工作负载。

第二步:安装 WinPcap 开发包

去官网下载 WinPcap 4.1.2 安装包,以及 WinPcap Developer's Pack。安装后把开发包里的 Include 和 Lib 目录记下来,后面 cmake 要用。

第三步:用 cmake 生成 VS 工程

打开「Developer Command Prompt for VS 2019」,然后:

cd SOEM
mkdir build && cd build
cmake .. -G "Visual Studio 16 2019" -A x64 \
  -DPCAP_INCLUDE_DIR="C:\WpdPack\Include" \
  -DPCAP_LIBRARY="C:\WpdPack\Lib\x64\Packet.lib"

这里路径要改成你实际安装的位置。我记得第一次搞的时候,路径写错了,cmake 报了一堆红字。后来学乖了,先用绝对路径试通,再考虑用环境变量。

第四步:编译

cmake 成功后,会在 build 目录下生成 SOEM.sln。双击打开,在 Visual Studio 里选择 Release 或 Debug,然后生成解决方案。

注意: Windows 下如果要用抓包功能,必须以管理员权限运行程序。否则 pcap 初始化会失败。我曾经因为这个排查了半天,最后发现是权限问题。

2.3 常见编译错误解决

编译错误嘛,谁都会遇到。我把这些年碰到的典型问题整理了一下,你遇到类似情况可以对照着看。

错误1:找不到 pcap.h

这个最常见。Linux 下一般是没装 libpcap-dev,Windows 下是没指定 Include 路径。

解决办法:

  • Linux:sudo apt-get install libpcap-dev
  • Windows:cmake 时加上 -DPCAP_INCLUDE_DIR=...

错误2:undefined reference to 'pcap_*'

链接错误,说明找到了头文件但没找到库文件。Linux 下检查一下 libpcap.so 是否在标准路径里,Windows 下检查 Lib 路径是否正确。

错误3:clock_gettime 未定义

这个在旧版 Linux 上容易出现。原因是 librt 库没链接。解决办法是在 CMakeLists.txt 里加上:

target_link_libraries(soem rt)

我曾经在 CentOS 6 上遇到过这个问题,折腾了好久才发现是 librt 的事。

错误4:Windows 下编译报错 'NtCreateFile' 未定义

这是 WinPcap 版本和 Visual Studio 版本不兼容导致的。我建议换成 Npcap,它对新版 VS 支持更好。安装 Npcap 时记得勾选「Install in WinPcap API-compatible Mode」。

避坑指南: 我曾经在 Windows 10 + VS 2022 环境下,用 WinPcap 4.1.2 死活编译不过。后来换成 Npcap 1.60,一次通过。所以如果你用新版 VS,建议直接上 Npcap。

错误5:make 时提示 'SOEM' 目标重复

这个一般是之前编译没清理干净。执行 make clean 或者删掉 build 目录重新 cmake 即可。

2.4 编译验证

编译通过后,怎么确认 SOEM 能正常工作?我一般跑一下自带的 simple_test 示例:

cd SOEM/build
./test/simple_test/simple_test

如果能看到类似这样的输出,说明编译成功了:

SOEM (Simple Open EtherCAT Master)
Simple test for SOEM
Starting...
ec_init on eth0 succeeded.

嗯,这里要注意,运行前要确保网线已经连上了 EtherCAT 从站设备。如果没有从站,程序会卡在等待状态。

调试小技巧: 如果没有硬件设备,可以用 SOEM 自带的虚拟网卡模式测试。在 cmake 时加上 -DENABLE_VIRTUAL_NIC=ON,就可以在没有硬件的情况下验证编译是否正确。

好了,编译这块就这些。说白了就是三步:装依赖、配路径、敲命令。遇到问题别慌,对照上面的错误列表排查,基本都能解决。

SOEM 编译流程总览 获取源码 安装依赖 配置编译选项 Linux 编译 Windows 编译 交叉编译 常见编译错误:找不到头文件 | 链接错误 | 版本不兼容 | 路径问题 编译成功 → 运行测试验证

专注资料整理