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

Jetson平台Canon EDSDK与C++适配编译报错求助

在Jetson Orin Nano(Ubuntu 20.04 aarch64)上编译Canon EDSDK C++项目时出现类型未定义错误

我正尝试在Jetson Orin Nano(Ubuntu 20.04 aarch64)上使用官网最新版Canon EDSDK进行C++开发,CLion编辑阶段无报错,但编译时出现大量类型未定义错误(如__int64、WCHAR等)。以下是编译错误日志及CMakeLists.txt配置,求解决思路。

编译错误日志

FAILED: CMakeFiles/InspectorMain.dir/main.cpp.o 
/usr/bin/c++  -I/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header -I/home/inspector/CLionProjects/InspectorMain/Lib -isystem /usr/local/include/opencv4 -g -fdiagnostics-color=always -MD -MT CMakeFiles/InspectorMain.dir/main.cpp.o -MF CMakeFiles/InspectorMain.dir/main.cpp.o.d -o CMakeFiles/InspectorMain.dir/main.cpp.o -c /home/inspector/CLionProjects/InspectorMain/main.cpp
In file included from /home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:31,
                 from /home/inspector/CLionProjects/InspectorMain/main.cpp:4:
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDKTypes.h:122:9: error: ‘__int64’ does not name a type; did you mean ‘__rintf64’?
  122 | typedef __int64             EdsInt64;
      |         ^~~~~~~
      |         __rintf64
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDKTypes.h:123:29: error: expected initializer before ‘EdsUInt64’
  123 | typedef unsigned __int64    EdsUInt64;
      |                             ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDKTypes.h:1316:5: error: ‘EdsUInt64’ does not name a type; did you mean ‘EdsUInt32’?
 1316 |     EdsUInt64   maxCapacity;
      |     ^~~~~~~~~
      |     EdsUInt32
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDKTypes.h:1317:5: error: ‘EdsUInt64’ does not name a type; did you mean ‘EdsUInt32’?
 1317 |     EdsUInt64   freeSpaceInBytes;
      |     ^~~~~~~~~
      |     EdsUInt32
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDKTypes.h:1327:5: error: ‘EdsUInt64’ does not name a type; did you mean ‘EdsUInt32’?
 1327 |     EdsUInt64   size;
      |     ^~~~~~~~~
      |     EdsUInt32
In file included from /home/inspector/CLionProjects/InspectorMain/main.cpp:4:
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:574:42: error: ‘EdsUInt64’ has not been declared
  574 |                                          EdsUInt64              inReadSize,
      |                                          ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:732:29: error: ‘EdsUInt64’ was not declared in this scope; did you mean ‘EdsUInt32’?
  732 |                             EdsUInt64               inBufferSize,
      |                             ^~~~~~~~~
      |                             EdsUInt32
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:733:41: error: expected primary-expression before ‘*’ token
  733 |                             EdsStreamRef*           outStream );
      |                                         ^
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:733:53: error: ‘outStream’ was not declared in this scope
  733 |                             EdsStreamRef*           outStream );
      |                                                     ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:733:63: error: expression list treated as compound expression in initializer [-fpermissive]
  733 |                             EdsStreamRef*           outStream );
      |                                                               ^
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:761:15: error: ‘WCHAR’ does not name a type
  761 |         const WCHAR*                inFileName,
      |               ^~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:787:17: error: ‘EdsUInt64’ has not been declared
  787 |                 EdsUInt64               inBufferSize,
      |                 ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:837:17: error: ‘EdsUInt64’ has not been declared
  837 |                 EdsUInt64               inReadSize,
      |                 ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:839:17: error: ‘EdsUInt64’ has not been declared
  839 |                 EdsUInt64*              outReadSize );
      |                 ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:861:17: error: ‘EdsUInt64’ has not been declared
  861 |                 EdsUInt64               inWriteSize,
      |                 ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:863:17: error: ‘EdsUInt64’ has not been declared
  863 |                 EdsUInt64*              outWrittenSize );
      |                 ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:890:17: error: ‘EdsInt64’ has not been declared
  890 |                 EdsInt64                inSeekOffset,
      |                 ^~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:910:17: error: ‘EdsUInt64’ has not been declared
  910 |                 EdsUInt64*              outPosition );
      |                 ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:928:17: error: ‘EdsUInt64’ has not been declared
  928 |                 EdsUInt64*              outLength );
      |                 ^~~~~~~~~
/home/inspector/CLionProjects/InspectorMain/Lib/EDSDK/Header/EDSDK.h:952:17: error: ‘EdsUInt64’ has not been declared
  952 |                 EdsUInt64               inWriteSize,
      |                 ^~~~~~~~~

CMakeLists.txt配置

cmake_minimum_required(VERSION 3.5)
project(InspectorMain)

# Set CUDA directory
set(CUDA_DIR /usr/local/cuda)

set(OpenCV_DIR /usr/local/include/opencv4/opencv2)
find_package(OpenCV 4 REQUIRED)

# Add executable
add_executable(InspectorMain
        main.cpp
        headerFiles/Stitcher.h
        headerFiles/camera.h
        headerFiles/general.h
        camera.cpp
)

# Include directories
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/Lib/EDSDK/Header)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/Lib)

# Link OpenCV libraries
target_link_libraries(InspectorMain ${OpenCV_LIBS})

# Link with the shared library (libEDSDK.so)
target_link_libraries(InspectorMain ${CMAKE_CURRENT_SOURCE_DIR}/Lib/EDSDK/ARM64/libEDSDK.so)

解决思路

  • 添加跨平台类型定义:EDSDK原本为Windows平台开发,__int64、WCHAR是Windows专属类型。在CMake中添加编译预定义宏,将这些类型映射到Linux标准类型:

    target_compile_definitions(InspectorMain PRIVATE
        __int64=long long
        WCHAR=wchar_t
    )
    

    或者强制编译器包含标准头文件,提前定义这些类型:

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include stdint.h -include wchar.h")
    
  • 检查EDSDK版本兼容性:确认下载的EDSDK官方ARM64版本是否完整适配Linux aarch64架构。部分版本可能仅提供二进制库,头文件未做跨平台处理,需要更换为官方明确支持Linux ARM的版本。

  • 修改EDSDK头文件(可选):如果头文件无跨平台条件编译,可手动修改EDSDKTypes.h:

    • 将typedef __int64 EdsInt64;替换为typedef int64_t EdsInt64;(需确保包含<stdint.h>)
    • 将typedef unsigned __int64 EdsUInt64;替换为typedef uint64_t EdsUInt64;
    • 将WCHAR替换为wchar_t
  • 指定C++标准:在CMake中明确设置C++标准,确保编译器支持现代类型定义:

    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    

内容的提问来源于stack exchange,提问作者koen Lammers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:24:57