Необходимо включить Accelerate framework в Xcode

#objective-c #xcode #ios #frameworks #lapack

#objective-c #xcode #iOS #фреймворки #lapack

Вопрос:

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

В настоящее время я программирую приложение, в котором будут выполняться некоторые интенсивные вычисления, и, похоже, мне нужно добавить библиотеку CLAPACK. Я считаю, что Acceleration Framework — это правильный путь, но, похоже, я просто не могу заставить его работать:

без фреймворка у меня куча ошибок компоновщика, сообщающих мне, что я пропускаю, среди прочего, cblas_zgemm и dgetrf (всего их более дюжины, разбросанных примерно по 30 файлам).

после того, как я добавляю фреймворк в проект и ни на йоту не изменяю свой код, ошибка компоновщика cblas_zgemm исчезает, но dgetrf остается (несмотря на принадлежность к фреймворку).

Если я добавлю #include (or #import) <Accelerate/Accelerate.h> , я получу более 1000 ошибок компоновщика, сообщающих мне, что я повторно объявляю кучу счетчиков (например, CblasTrans) и что для xyz существуют конфликтующие типы… Сообщения об ошибках, похоже, повторяются, в то время как dgetrf остается неопределенным.

Что я делаю не так / чего мне не хватает?

Спасибо

редактировать: полные сообщения об ошибках после добавления:

 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/cblas.h:12: error: redeclaration of enumerator 'CblasLower'


/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/cblas.h:182: error: conflicting types for 'cblas_sgemv'
  

правка 2:
исходные ошибки компоновщика после добавления фреймворка:

 "_dgetrf", referenced from:
      _aaConditionNumber in libccodeLab.a(condNumber.o)
      _aaInvMatrixLUDri in libccodeLab.a(invMtrxLUDri.o)
      _aaLUFactorEx in libccodeLab.a(LU.o)
  "_dgetri", referenced from:
      _aaConditionNumber in libccodeLab.a(condNumber.o)
      _aaInvMatrixLUDri in libccodeLab.a(invMtrxLUDri.o)
      _aaLUInvMatrix in libccodeLab.a(LUInvMtrx.o)
  "_zgesdd", referenced from:
      _aaCxSVD in libccodeLab.a(cxSVD.o)
  "_dgeev", referenced from:
      _aaGenEigenValueVector in libccodeLab.a(eigenV.o)
  "_dpotrf", referenced from:
      _aaInvMatrixChoDri in libccodeLab.a(invMtrxChoDri.o)
  "_dpotri", referenced from:
      _aaInvMatrixChoDri in libccodeLab.a(invMtrxChoDri.o)
  "_dtrtri", referenced from:
      _aaInvMatrixTriDri in libccodeLab.a(invMtrxTriDri.o)
  "_dgelqf", referenced from:
      _aaQRWithoutPivot in libccodeLab.a(QRWithoutPivot.o)
  "_dorglq", referenced from:
      _aaQRWithoutPivot in libccodeLab.a(QRWithoutPivot.o)
  "_dgesdd", referenced from:
      _aaSVDS in libccodeLab.a(SVDS.o)
      _aaSVD in libccodeLab.a(SVD.o)
  "_dsyevd", referenced from:
      _aaSymEigenValueVector in libccodeLab.a(symEigenV.o)
  

Комментарии:

1. можете ли вы вставить сообщения об ошибках в свой вопрос

2. Вам нужно добавить Accelerate Framework и #import соответствующий (общий) заголовочный файл. Поскольку вы это сделали и получаете ошибки повторного объявления / конфликтующих типов, похоже, что ваши исходные файлы также включают заголовочные файлы другой реализации LAPACK (C). Посмотрите, сможете ли вы их обнаружить и удалить (не забудьте сначала создать резервную копию своего проекта или использовать систему контроля версий).

3. @Bavarious: еще немного просмотрев код, я обнаружил файл заголовка, ссылающийся на mkl_lapack.h и mkl_cblas.h. Код, похоже, тесно связан с этим методом. В любом случае, я могу солгать компилятору и заставить его поверить, что Lapack от Apple так же хорош?

4. в качестве альтернативы, могу ли я просто включить clapack.h (хотя, как мне напрямую ссылаться на это?) или что-то более точное?

Ответ №1:

итак, после прочтения некоторых документов мне не нужно добавлять инструкцию include: достаточно просто иметь фреймворк в проекте.

Проблема в том, что LAPACK от Apple не распознает, _dgetrf скорее, он ищет dgetrf_ . Также все должно передаваться по ссылке.

документацию можно найти здесь: Векторные библиотеки