3. 开发环境搭建:操作系统选择、编译器配置、SDK获取与安装、依赖库管理
环境搭建这事,看着基础,但真能卡住不少人。我见过太多人 SDK 下好了,一编译全是红错,最后发现是编译器版本不对。咱们一步步来,把坑提前填上。
3.1 操作系统选哪个?Windows 还是 Linux
说实话,没有的好坏,得看你的应用场景。
| 对比项 | Windows | Linux (Ubuntu 20.04/22.04) |
|---|---|---|
| 驱动安装 | 一键安装,厂商支持最好 | 需要手动编译驱动,部分厂商只提供源码 |
| 开发工具 | Visual Studio 生态成熟 | GCC/CMake 为主,Qt 支持好 |
| 实时性 | 一般,适合原型验证 | 内核可调,适合产线部署 |
| 多相机同步 | 依赖硬件触发,软件同步精度有限 | 配合 PTP 可实现微秒级同步 |
| 我的建议 | 初学者、快速原型、UI 开发 | 产线部署、多相机系统、高精度同步 |
个人习惯: 我平时开发用 Windows,调试方便。但最终部署到产线,一定会换成 Ubuntu。为什么?因为产线需要 7×24 小时稳定运行,Windows 更新重启那一下,可能就导致一批产品漏检。
3.2 编译器配置:VS 还是 Qt?
编译器选不对,SDK 根本跑不起来。这里我踩过坑,跟大家说说。
3.2.1 Visual Studio 配置要点
大部分工业相机 SDK 官方示例都是基于 VS 的。我个人推荐 VS 2019 或 2022,社区版就够用。
- 平台集选择: 一定要选
X64,别用 Win32。现在相机动辄 500 万像素,32 位程序内存不够用。 - 字符集: 设置成
使用多字节字符集。很多 SDK 的字符串接口是 char* 类型,用 Unicode 会报类型不匹配。 - 附加包含目录: 指向 SDK 的
Include文件夹。 - 附加库目录: 指向 SDK 的
Lib文件夹。 - 附加依赖项: 手动添加
xxx.lib文件名。
我曾经犯过的错: 有一次我直接复制了 Debug 模式的配置到 Release,结果 Release 编译通过,运行就崩溃。后来发现是 Release 下忘了加
_CRT_SECURE_NO_WARNINGS 预处理器定义。嗯,这种小细节最坑人。
3.2.2 Qt 环境配置
如果你要做跨平台 UI,Qt 是首选。我习惯用 Qt 5.15 或 Qt 6.5,搭配 MSVC 2019 编译器。
# 在 .pro 文件中添加 SDK 路径
INCLUDEPATH += C:/SDK/Include
LIBS += -LC:/SDK/Lib -lxxx_api
# 或者用 CMake
target_include_directories(${PROJECT_NAME} PRIVATE "C:/SDK/Include")
target_link_libraries(${PROJECT_NAME} PRIVATE "C:/SDK/Lib/xxx_api.lib")
这里要注意:Qt 的 MinGW 编译器跟很多 SDK 不兼容。你想想看,SDK 厂商一般只提供 MSVC 编译的 lib 文件,MinGW 根本链接不上。所以老老实实用 MSVC 版本。
3.3 SDK 获取与安装
不同厂商的 SDK 获取方式大同小异,但安装细节有区别。
| 厂商 | SDK 名称 | 获取方式 | 安装后关键目录 |
|---|---|---|---|
| 海康威视 | MVS | 官网下载 | Development\Includes, Development\Libs |
| 大恒图像 | Galaxy SDK | 官网下载 | Includes, Lib\Win64 |
| Basler | pylon | 官网下载 | pylon\Development\Include, pylon\Development\Lib |
| Baumer | Baumer GAPI SDK | 官网下载 | Baumer_GAPI_SDK\Include, Baumer_GAPI_SDK\Lib |
安装后的第一件事: 打开设备管理,看看相机驱动是否正常。如果出现黄色感叹号,说明驱动没装好。我遇到过好几次,都是因为杀毒软件拦截了驱动安装。
3.4 依赖库管理
SDK 不是孤立的,它依赖一堆运行时库。搞不定这些,程序跑不起来。
3.4.1 运行时库
- VC++ 运行库: 几乎所有 SDK 都需要。安装
vc_redist.x64.exe即可。 - .NET Framework: 如果 SDK 提供 C# 示例,需要 4.7.2 以上版本。
- OpenCV: 如果你要做图像处理,建议用 4.5.5 以上版本。注意 OpenCV 的编译工具集必须跟你的项目一致。
3.4.2 DLL 管理
说白了,就是让程序能找到 DLL。有三种方式:
- 拷贝到 exe 目录: 最简单,但项目大了会乱。
- 设置环境变量 PATH: 把 SDK 的
Runtime目录加进去。我习惯用这种方式。 - 在代码中加载: 用
SetDllDirectory或LoadLibrary动态加载。适合需要热切换的场景。
避坑指南: 我曾经把 32 位的 DLL 放到了 64 位程序的目录下,结果程序启动就报
0xc000007b 错误。排查了半天,最后发现是 DLL 位数不对。所以一定要确认:你的程序是 X64,DLL 也得是 X64。
3.5 环境搭建整体流程
下面这张图,是我总结的环境搭建流程。照着走,基本不会出错。
3.6 验证环境是否搭建成功
环境搭完,别急着写代码。先跑通 SDK 自带的示例程序。
// 最简单的验证代码:打开相机并获取一帧图像
#include <stdio.h>
#include "xxx_api.h" // 替换为实际 SDK 头文件
int main() {
// 初始化 SDK
int ret = XXX_Init();
if (ret != 0) {
printf("SDK 初始化失败,错误码:%d\n", ret);
return -1;
}
// 枚举相机
int cameraCount = 0;
XXX_EnumCameras(&cameraCount);
printf("检测到 %d 台相机\n", cameraCount);
if (cameraCount > 0) {
// 打开第一台相机
int handle = 0;
XXX_OpenCamera(0, &handle);
printf("相机打开成功,句柄:%d\n", handle);
// 开始采集
XXX_StartGrabbing(handle);
printf("开始采集图像...\n");
// 获取一帧
unsigned char* buffer = NULL;
int size = 0;
XXX_GetFrame(handle, &buffer, &size, 1000);
if (buffer) {
printf("成功获取一帧图像,大小:%d 字节\n", size);
XXX_FreeFrame(buffer);
}
// 停止采集并关闭
XXX_StopGrabbing(handle);
XXX_CloseCamera(handle);
}
// 反初始化
XXX_Uninit();
return 0;
}
验证通过的标准: 控制台输出 "成功获取一帧图像",并且没有崩溃。如果这一步过了,恭喜你,环境搭建成功了。后面就可以放心写业务逻辑了。
嗯,环境搭建这部分就这些。别看步骤多,其实熟练了十分钟就能搞定。关键是每一步都要确认无误,别跳步骤。我刚开始带团队时,有个新人跳过了驱动安装验证,结果调试了三天才发现相机根本没被识别。这种时间浪费,完全没必要。