编译与验证指南
本页说明如何在没有连接实物控制器的情况下,验证二次开发程序是否「写对了」。适用于上位机 SDK(默认开发方式);示例以 C++ 为主,C# / Python 见第 6 节。
1. 三级验证
| 级别 | 验证内容 | 通过标准 |
|---|---|---|
| L1 语法检查 | 头文件引用、类型、语法错误 | 编译器无报错 |
| L2 编译 + 链接 | 库文件齐全、ABI 匹配(编译器、x86/x64、Debug/Release) | 成功生成可执行文件 |
| L3 运行自检 | 可执行文件能启动、SDK 库能加载、连接调用能执行 | 未接控制器时走到「连接失败」提示 |
为什么要做 L3
L3 能在无硬件条件下验证:程序能启动、动态库能被加载、接口调用路径成立。接入控制器后,同一程序只需替换 IP 即可完成真实联调。
2. L1:语法检查(最快)
bash
# MinGW / Linux(g++;包含目录按你的工程结构调整)
g++ -fsyntax-only -I ./include main.cpp
# MSVC(在「开发者命令提示符」中执行)
cl /Zs /I include main.cpp语法检查只验证代码本身,不检查库文件与链接关系。
3. L2:编译 + 链接
各环境的完整工程配置(头文件路径、库文件、动态库复制等)见环境搭建教程:
Linux(与教程中的 Makefile 一致):
bash
g++ -o demo src/*.cpp -I./include -L./lib -lnrc_host -lpthread -lm -ldl -lrt -lstdc++ -std=c++11 -fPIC
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
./demo链接阶段常见错误对照:
| 现象 | 常见原因 | 处理 |
|---|---|---|
undefined reference / LNK2019 找不到符号 | 库未链接,或编译器 ABI 不匹配 | 确认链接了 nrc_host 库文件,且与编译套件(MinGW/MSVC)一致 |
找不到 nrc_host.lib / libnrc_host.dll.a | 库搜索路径不对 | 检查 -L 路径 / 附加库目录配置 |
| 架构不匹配报错 | 32 位与 64 位混用 | 程序与库统一 x64 |
4. L3:无硬件运行自检
编译出可执行文件后直接运行(不需要控制器),对照下表判断:
| 运行结果 | 说明 |
|---|---|
| 等待数秒后输出「连接失败」并正常退出 | 可执行文件、SDK 动态库加载、连接调用路径均正常(未接控制器属预期结果) |
提示缺少 nrc_host.dll / libnrc_host.so | 动态库不在查找路径:Windows 将 DLL 放到可执行文件同目录;Linux 设置 LD_LIBRARY_PATH |
启动即崩溃或报 0xC000007B | 架构或编译器不匹配(x86/x64、MinGW/MSVC 混用),更换对应 SDK 重新编译 |
| 长时间无响应 | 检查程序逻辑(如等待连接就绪的循环)以及防火墙 / 网络配置 |
等待时长取决于系统的连接超时设置,通常几秒到数十秒。
自检通过后再接入控制器做真实联调:把示例中的 IP 换成现场控制器 IP 即可。
5. 仿真验证(待补充)
仿真环境(虚拟控制器)的接入方式确认后补充到本节,预计包含:仿真环境启动方式、连接参数(IP / 端口)、支持的指令范围。在此之前,请以第 4 节的编译级验证为准。
6. C# 与 Python 的差异
- C#:编译由 Visual Studio 或
dotnet build完成;运行时确认nrc_host.dll位于输出目录(环境搭建教程中有「复制到输出目录」配置)。运行自检判断方式相同,见 C# 环境搭建。 - Python:无需编译,直接用解释器运行;确认本地库(
_nrc_host)与 Python 版本、架构严格匹配,见 Python 环境搭建。 - 两者运行自检同样以「连接失败」分支输出为准。
7. 相关页面
- 环境搭建:见第 3 节三个平台的教程入口
- Agent 开发指引(任务索引与避坑速查)
- 常见问题(含库加载失败、版本不匹配的排查步骤)
- 版本与兼容性(SDK 与控制器固件的对应关系)