EDSDK 3.6 macOS - 32位vs 64位和链接错误

时间:2017-08-07 16:39:18

标签: c++ macos llvm-clang edsdk

我正在尝试在macOS上使用简单的C ++命令行程序使用Canon EDSDK(最新版本,编写时为v3.6)(Sierra 10.12.6)。我希望利用一个简单的Makefile环境和通常的苹果编译器工具(llvm-clang)并避免使用Xcode或任何其他重量级的IDE。 SDK中包含的示例都是以Xcode为中心的,所以我必须在这里自己动手。

目前,我可以编译一个程序来启动SDK并列出已连接的摄像头。但是,只要我执行任何EDSDK命令,我就会收到动态链接错误:

Error loading /Library/Frameworks/EDSDK.framework/Versions/A/DppCore.bundle/Contents/PlugIns/DppCoreG.bundle/Contents/MacOS/DppCoreG:  dlopen(/Library/Frameworks/EDSDK.framework/Versions/A/DppCore.bundle/Contents/PlugIns/DppCoreG.bundle/Contents/MacOS/DppCoreG, 262): no suitable image found
Did find: ... snip ... mach-o, but wrong architecture

相同的错误列出两次(均为DppCoreG)。经过检查,DppCoreG编译为64位架构:

file /Library/Frameworks/..snip../DppCoreG
/Library/Frameworks/..snip../DppCoreG: Mach-O 64-bit bundle x86_64

但是,EDSDK的其他关键部分仅针对32位架构进行编译:

file /...snip.../DPP.framework/DPP 
/...snip.../DPP.framework/DPP: Mach-O dynamically linked shared library i386

我该如何解决这个问题?到目前为止,阻力最小的路径是明确地编译到i386架构(并且文档明确指出EDSDK不是64位兼容的)。一切都很好,除了这一个动态链接错误(实际上我到目前为止所有尝试过的,只是列出连接的相机,似乎工作正常)但是我确信我不能继续忽略或允许它坚持这个项目的生产版本。

以下是导致DYLD错误的最小示例:

#include <EDSDK.h>
#include <EDSDKTypes.h>
#include <EDSDKErrors.h>

int main(int argc, char** argv) {
  EdsInitializeSDK();
  EdsTerminateSDK();
  return 0;
}

编译命令可能提供更多信息:

c++ -D __MACOS__ -g -arch i386 -I./deps/mac/include -framework DPP -framework EDSDK -o min min.cpp

我在命令中显示的本地include目录和/ Library / Frameworks下安装的框架中有标题。

请注意,c ++命令为Apple LLVM version 8.1.0 (clang-802.0.42)

3 个答案:

答案 0 :(得分:1)

我的结论是,这只是那些为mac提供EDSDK的错误。他们应该将这个特定的包编译为通用二进制文件,而不是64位二进制文​​件。您只需删除有问题的捆绑包即可解决此问题。它似乎只是一个插件,删除它似乎不会立即影响SDK。假设您已在/ Library / Frameworks中安装了EDSDK框架,那么就这样做:

sudo rm -rf /Library/Frameworks/EDSDK.framework/Versions/Current/DppCore.bundle/Contents/PlugIns/DppCoreG.bundle

出现提示时输入密码(假设您是管理员帐户),它将删除有问题的插件。

我必须相信,在某些时候删除此插件可能会产生影响,如果有人知道更多有关此特定捆绑/插件的信息,并且可以解释删除它会做什么,我会非常感谢您提供额外的见解。

答案 1 :(得分:1)

除了@OllieBrown的回答之外,我在Mac OS的Xcode构建中发现我还有一个要删除的项目来停止链接警告。

链接警告 - EDSDK.framework / Versions / Current / DPPLibCom.bundle / Contents / MacOS / DPPLibCom:mach-o,但架构错误

删除EDSDK.framework / Versions / Current / DppLibCom.bundle停止了警告。

答案 2 :(得分:0)

自3.x版本以来,DPP RAW功能的集成版本之间存在分歧。原始DPP仅在x86模式下工作,允许在凸轮上检查和转换CR2文件,直到某些型号为止。请参阅API文档以获取列表。对于最近依赖于新的64位DPP引擎(v4 +?,dppcoreg)的相机型号,您需要x86_64位构建,以便动态链接以使用最新功能。相当一些(原始)功能被删除,并逐渐回到beta状态。