You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类使用场景)

  1. 创建正确的项目类型:直接创建MFC应用程序项目,选择“基于对话框”或“单文档”模板,后续可删除默认界面代码
  2. 确认MFC设置:项目属性→常规→MFC的使用,确保设置为使用共享DLL中的MFC
  3. 强制包含MFC头文件:在代码最顶部添加:
    #include <afxwin.h>
    #include <afxext.h>
    
    同时在项目属性→C/C++→预处理器→预处理器定义中添加_AFXDLL,确保MFC核心头文件在SapClassGui.h之前加载
  4. 字符集设置:项目属性→常规→字符集,保持未设置,避免MFC头文件编码冲突
  5. 匹配库文件版本:VS2022优先使用SDK中VS2019版本的库文件,路径为$(SAPERADIR)\Lib\Win64\VS2019\SapClassGui.lib/SapClassGuiD.lib

方案二:绕过MFC,使用基础类+自定义显示(简化方案)

若无需SDK自带GUI组件,可只使用基础类采集图像,通过OpenCV实现实时显示,彻底规避MFC依赖:

  1. 移除GUI相关代码:删除#include "SapClassGui.h"、SapView对象及回调中的pView->Show()
  2. 简化项目配置:仅保留基础类的配置步骤,无需添加GUI类的包含目录和库文件
  3. 添加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);
      }
      
  4. 调整main函数:移除SapView相关代码,添加OpenCV窗口初始化代码

方案三:项目属性一键修复

  1. 右键项目→属性→C/C++→常规,附加包含目录添加:
    $(SAPERADIR)\Include;$(SAPERADIR)\Classes\Basic;$(SAPERADIR)\Classes\Gui;$(VCInstallDir)atlmfc\include;
    
  2. 链接器→常规→附加库目录,添加:
    $(SAPERADIR)\Lib\Win64\VS2019;$(VCInstallDir)atlmfc\lib\x64;
    
  3. 链接器→输入→附加依赖项,添加:
    SapClassBasic.lib;SapClassGuiD.lib;afxwin.lib;afxext.lib;
    
    (Release模式替换为SapClassGui.lib)

内容的提问来源于stack exchange,提问作者Behrad B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:22:14