c++ - EDSDK 3.6 macOS - 32 位与 64 位和链接错误

标签 c++ macos llvm-clang edsdk

我正在尝试在 macOS (Sierra 10.12.6) 上的一个简单的 C++ 命令行程序中使用 Canon EDSDK(最新版本,撰写本文时为 v3.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

我在命令中显示的本地包含目录中有 header ,并且框架安装在/Library/Frameworks 下。

注意c++命令是Apple LLVM version 8.1.0 (clang-802.0.42)

最佳答案

我得出的结论是,这只是为 mac 提供 EDSDK 的那些人的错误。他们应该将这个特定的包编译为通用二进制文件,而不是 64 位二进制文​​件。您可以通过简单地删除有问题的包来解决这个问题。它似乎只是一个插件,删除它似乎不会立即影响 SDK。假设您已经在/Library/Frameworks 中安装了 EDSDK 框架,那么只需执行以下操作:

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

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

我不得不相信,在某个时候删除这个插件可能会产生后果,如果有人对这个特定的包/插件有更多的了解,并且可以解释删除它会有什么影响,我将不胜感激。

关于c++ - EDSDK 3.6 macOS - 32 位与 64 位和链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551810/

相关文章:

C++类成员变量交互

c++ - 基类型为函数引用时右值引用重载

c++ - QT 应用程序因 QStringList 指针而崩溃

macos - 与 AVX/AVX2 一起使用的 OS X 最低版本是多少?

c++ - 如何更新 clang 版本以编译 C++11 项目? (在 Mac 上)

c++ - 在开发过程中每次都必须重新编译 C++ 代码吗?

c++ - 如何在 LLVM 的 LowerTypeTests Pass 中设置断点?

c++ - Qt - QPropertyAnimation 中存在错误?

llvm - 如何使用 native 编译器 (g++) 编译和运行 llc-3.4 生成的 C++ 代码?

python - 如何使用 libc.dylib 在 OS X 上为 stdout 获取相应的 ctype