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
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,然后生成解决方案。
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」。
错误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 从站设备。如果没有从站,程序会卡在等待状态。
-DENABLE_VIRTUAL_NIC=ON,就可以在没有硬件的情况下验证编译是否正确。
好了,编译这块就这些。说白了就是三步:装依赖、配路径、敲命令。遇到问题别慌,对照上面的错误列表排查,基本都能解决。