Canon EDSDK аварийно завершает работу с EXC_BAD_ACCESS в Mac OS 10.7.5 в очень простой программе

Я пытаюсь написать консольное приложение для доступа к камере Canon в Mac OS X 10.7.5. Для этого я использую XCode версии 4.6. Это программа, которую я пытаюсь написать

#import <Foundation/Foundation.h>
#include "EDSDK.h"
#include "EDSDKErrors.h"
#include "EDSDKTypes.h"


int main()
{
    @autoreleasepool {
        EdsError error = EDS_ERR_OK;
        EdsCameraListRef cameraList = NULL;
        EdsUInt32 count = 0;
        EdsDeviceInfo deviceInfo;
        bool isSDKLoaded;

        // Initialization of SDK
        error = EdsInitializeSDK();

        //Acquisition of camera list
        if(error == EDS_ERR_OK)
        {
            isSDKLoaded = YES;
            error = EdsGetCameraList(&cameraList);
        }
        if(cameraList != NULL) {
            EdsRelease(cameraList);
            cameraList = NULL;
        }

    }
    return 0;
}

Он успешно компилируется, но когда я запускаю программу, происходит сбой при возврате функции EdsGetCameraList. Показана ошибка dyld misaligned_stack_error. Я понимаю, что это как-то связано с тем, что MacOS X хочет, чтобы стек был выровнен по 16 байтам. SDK, который я использую, доступен только для 32-битных архитектур, поэтому я настроил архитектуру соответствующим образом. Я попытался установить «Другие флаги C» в разделе «Параметры сборки» в XCode, чтобы также включить флаг «-falign-stack = accept-16-byte».

Образец, поставляемый вместе с Canon EDSDK, работает нормально. Используемая версия SDK - это версия, разработанная Canon в 2006-2007 гг., Обновленная 06-03-16. Другой информации о версии у меня нет.

Ниже приводится дамп логов: http://pastebin.com/vfDWeZnr

Что я мог делать не так?

Я действительно новичок в Objective-C и, следовательно, в смеси кода C и Objective-C.

Спасибо!


person niting    schedule 10.04.2013    source источник


Ответы (1)


Вы уверены, что инициализировать cameraList не нужно? Я предполагаю, что функция хочет писать по указанному вами адресу, но это указывает на NULL, отсюда и ошибка. В C я бы использовал здесь malloc() для получения указателя, но я не знаю эквивалента для objective-C.

person Max Leske    schedule 10.04.2013
comment
Функция EdsGetCameraList делает это за меня. Все образцы кодов в Интернете используют одну и ту же форму инициализации. Они инициализируют его значением NULL и вызывают функцию. Поправьте меня, если считаете, что я все еще не прав. - person niting; 10.04.2013
comment
Где вы нашли этот код? В строке 124 вашего журнала есть следующее: dlopen(NULL, 0x00000110). Это означает, что вы пытаетесь открыть динамическую библиотеку по пути NULL, что явно бессмысленно. Поэтому мне интересно, как это могло сработать для человека, написавшего документацию. - person Max Leske; 10.04.2013
comment
Как ни странно, я перестал использовать Xcode с LLVM и перешел на Vim с g ++, и он компилировался и работал нормально. Я понятия не имею, почему это произошло, возможно, из-за флагов компиляции или чего-то в этом роде. - person niting; 15.04.2013