我正在尝试在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)
答案 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状态。