Visual Studio 2022构建Sapera LT SDK C++项目报错求助
使用Sapera LT SDK实现Nano相机采集显示的VS2022编译错误解决
问题背景
按照Sapera LT SDK用户手册步骤在Visual Studio 2022中构建C++项目,实现Nano相机图像采集与实时显示,却遭遇编译错误:
- 初始错误提示需将项目设置为“使用共享DLL中的MFC”
- 修改MFC设置后,出现
CRectTracker、CWnd等MFC基类未定义的系列错误 - 尝试过空项目、控制台应用、Windows应用等多种项目类型,均无法解决
手册给出的项目构建步骤
基础类使用步骤
- 源代码中包含
SapClassBasic.h(包含所有必需头文件) - 项目属性→C/C++→常规→附加包含目录,添加
$(SAPERADIR)\Classes\Basic和$(SAPERADIR)\Include - 32位应用:添加现有项
$(SAPERADIR)\Lib\Win32\SapClassBasic.lib - 64位应用:添加
$(SAPERADIR)\Lib\Win64\SapClassBasic.lib - 项目属性→C/C++→代码生成→运行库:Release模式选多线程DLL,Debug模式选多线程调试DLL
GUI类附加步骤
- 源代码中包含
SapClassGui.h(包含所有必需头文件) - 附加包含目录添加
$(SAPERADIR)\Classes\Gui - 32位应用:添加
$(SAPERADIR)\Lib\Win32\VS2013\SapClassGui.lib(对应VS版本)及SapClassGuiD.lib - 64位应用:添加
$(SAPERADIR)\Lib\Win64\VS2013\SapClassGui.lib(对应VS版本)及SapClassGuiD.lib - 项目属性→常规:字符集设置为未设置
SapClassGui.lib在Debug模式下设置“从构建中排除”SapClassGuiD.lib在Release模式下设置“从构建中排除”
所用测试代码
#include "SapClassGui.h" #include "conio.h" #include "SapClassBasic.h" // 每次传输完成一帧时调用传输回调函数 void XferCallback(SapXferCallbackInfo* pInfo) { // 显示最后传输的帧 SapView* pView = (SapView*)pInfo->GetContext(); pView->Show(); } // 示例程序 int main() { // 分配采集对象 SapAcqDevice* pAcq = new SapAcqDevice("Genie_M640_1", FALSE); // 使用相机默认设置 //new SapAcqDevice("Genie_M640", "MyCamera.ccf");//加载配置文件 // 分配缓冲区对象,直接从采集设备获取设置 SapBuffer* pBuffer = new SapBuffer(1, pAcq); // 分配视图对象,在内部创建的窗口中显示 SapView* pView = new SapView(pBuffer, (HWND)-1); // 分配传输对象,链接采集设备和缓冲区 SapAcqDeviceToBuf* pTransfer = new SapAcqDeviceToBuf(pAcq,pBuffer, XferCallback, pView); // 为所有对象创建资源 BOOL success = pAcq->Create(); success = pBuffer->Create(); success = pView->Create(); success = pTransfer->Create(); // 开始连续传输(实时采集) success = pTransfer->Grab(); printf("Press any key to stop grab\n"); getch(); // 停止传输并等待(超时5秒) success = pTransfer->Freeze(); success = pTransfer->Wait(5000); printf("Press any key to terminate\n"); getch(); // 释放所有对象的资源 success = pTransfer->Destroy(); success = pView->Destroy(); success = pBuffer->Destroy(); success = pAcq->Destroy(); // 释放所有对象 delete pTransfer; delete pView; delete pBuffer; delete pAcq; return 0; }
编译错误信息
首次构建错误
Build started at 15:59... 1>------ Build started: Project: Project1, Configuration: Debug x64 ------ 1>Source.cpp 1>C:\Program Files\Teledyne DALSA\Sapera\Classes\Gui\SapClassGui.h(36,1): error C1189: #error: The project option "General | Microsoft Foundation Classes" must be "Use MFC in a shared DLL" 1>(compiling source file 'Source.cpp') 1>Done building project "Project1.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
修改MFC设置后的错误(部分)
Error C2504 'CRectTracker': base class undefined Project1 C:\Program Files\Teledyne DALSA\Sapera\Classes\Gui\ImageWnd.h 16 Error C2061 syntax error: identifier 'CRect' Project1 C:\Program Files\Teledyne DALSA\Sapera\Classes\Gui\ImageWnd.h 21 ... Error C1003 error count exceeds 100; stopping compilation Project1 C:\Program Files\Teledyne DALSA\Sapera\Classes\Gui\ImageViewportWnd.h 188
解决优化方案
方案一:修正MFC项目配置(针对GUI类使用场景)
- 创建正确的项目类型:直接创建MFC应用程序项目,选择“基于对话框”或“单文档”模板,后续可删除默认界面代码
- 确认MFC设置:项目属性→常规→MFC的使用,确保设置为使用共享DLL中的MFC
- 强制包含MFC头文件:在代码最顶部添加:
同时在项目属性→C/C++→预处理器→预处理器定义中添加#include <afxwin.h> #include <afxext.h>_AFXDLL,确保MFC核心头文件在SapClassGui.h之前加载 - 字符集设置:项目属性→常规→字符集,保持未设置,避免MFC头文件编码冲突
- 匹配库文件版本:VS2022优先使用SDK中VS2019版本的库文件,路径为
$(SAPERADIR)\Lib\Win64\VS2019\SapClassGui.lib/SapClassGuiD.lib
方案二:绕过MFC,使用基础类+自定义显示(简化方案)
若无需SDK自带GUI组件,可只使用基础类采集图像,通过OpenCV实现实时显示,彻底规避MFC依赖:
- 移除GUI相关代码:删除
#include "SapClassGui.h"、SapView对象及回调中的pView->Show() - 简化项目配置:仅保留基础类的配置步骤,无需添加GUI类的包含目录和库文件
- 添加OpenCV显示逻辑:
- 配置OpenCV的包含目录、库文件路径
- 修改回调函数读取图像数据并显示:
void XferCallback(SapXferCallbackInfo* pInfo) { SapBuffer* pBuffer = (SapBuffer*)pInfo->GetBuffer(); void* pData; pBuffer->GetAddress(0, &pData); // 根据相机像素格式转换,示例为8位灰度图 cv::Mat frame(pBuffer->GetHeight(), pBuffer->GetWidth(), CV_8UC1, pData); cv::imshow("Live Feed", frame); cv::waitKey(1); }
- 调整main函数:移除
SapView相关代码,添加OpenCV窗口初始化代码
方案三:项目属性一键修复
- 右键项目→属性→C/C++→常规,附加包含目录添加:
$(SAPERADIR)\Include;$(SAPERADIR)\Classes\Basic;$(SAPERADIR)\Classes\Gui;$(VCInstallDir)atlmfc\include; - 链接器→常规→附加库目录,添加:
$(SAPERADIR)\Lib\Win64\VS2019;$(VCInstallDir)atlmfc\lib\x64; - 链接器→输入→附加依赖项,添加:
(Release模式替换为SapClassBasic.lib;SapClassGuiD.lib;afxwin.lib;afxext.lib;SapClassGui.lib)
内容的提问来源于stack exchange,提问作者Behrad B
相关产品推荐
相关产品推荐

