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
相关产品推荐
相关产品推荐

