EDSDK 3.6 macOS - 32-битные и 64-битные ошибки и ошибки компоновки

Я пытаюсь использовать Canon EDSDK (последняя версия v3.6 на момент написания) в простой программе на языке COS для командной строки на macOS (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 ответа

Я пришел к выводу, что это просто ошибка со стороны тех, кто поставляет EDSDK для Mac. Они должны компилировать этот конкретный пакет как универсальный двоичный файл, а не 64-битный двоичный файл. Вы можете обойти эту проблему, просто удалив поврежденный пакет. Похоже, что это просто плагин, и удаление его, кажется, не сразу влияет на SDK. Предполагая, что вы установили платформу EDSDK в /Library/Frameworks, просто сделайте это:

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

Введите пароль при появлении запроса (предполагается, что вы являетесь администратором), и он удалит нарушающий плагин.

Я должен верить, что могут быть последствия для удаления этого плагина в какой-то момент, и если кто-то знает больше об этом конкретном пакете / плагине и может объяснить, что будет делать его удаление, я был бы признателен за дополнительное понимание.

В дополнение к ответу @OllieBrown я обнаружил, что в сборке Xcode для MacOS у меня есть дополнительный элемент, который нужно удалить, чтобы остановить предупреждения о ссылках.

ссылка на предупреждение - EDSDK.framework/ Версии /Current/DPPLibCom.bundle/ Содержание /MacOS/DPPLibCom: машина, но неправильная архитектура

удаление EDSDK.framework/Versions/Current/DppLibCom.bundle остановило предупреждение.

Начиная с версии 3.x существует различие между интегрированными версиями возможностей DPP RAW. Оригинальный DPP работает только в режиме x86 и позволяет проверять и преобразовывать файлы CR2 на кулачках вплоть до определенных моделей. Смотрите API документ для списка. Для последних моделей камер, в которых используется новый 64-битный процессор DPP (v4+?, Dppcoreg), вам потребуется сборка x86_64 бит, чтобы она динамически связывалась для использования новейших функций. Некоторые (необработанные) функции отбрасываются и постепенно возвращаются в бета-состояние.

Другие вопросы по тегам