【问题标题】:Need to include Accelerate framework in Xcode需要在 Xcode 中包含 Accelerate 框架
【发布时间】:2011-05-06 04:45:37
【问题描述】:

在过去的一周里,我一直在构建一个庞大的静态库(>1000 个 C 文件),其中包含由独立第三方生成的文件。

目前,我正在编写一个将进行一些密集计算的应用程序,看来我需要添加 CLAPACK 库。我相信加速框架是要走的路,但我似乎无法让它发挥作用:

如果没有框架,我有一堆链接器错误告诉我我丢失了,其中包括 cblas_zgemm 和 dgetrf(总共有十几个分布在大约 30 个文件中)。

在我将框架添加到项目中并且没有更改我的代码一 iota 之后,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)

【问题讨论】:

  • 您能否将错误信息粘贴到您的问题中
  • 需要添加Accelerate框架,需要#import对应的(伞形)头文件。既然你已经这样做了并且你得到了重新声明/冲突类型错误,看起来你的源文件还包括另一个 (C)LAPACK 实现的头文件。看看你能不能发现这些,然后删除它们(不要忘记先备份你的项目,或者使用版​​本控制系统)。
  • @Bavarious:阅读更多代码,我发现了一个引用 mkl_lapack.h 和 mkl_cblas.h 的头文件。代码似乎与这种方法交织在一起。无论如何,我可以对编译器撒谎,让它相信 Apple 的 Lapack 也一样好?
  • 或者,我可以简单地包含 clapack.h(尽管我如何直接引用它?)或更精确的东西?

标签: objective-c xcode ios frameworks lapack


【解决方案1】:

所以在阅读了一些文档后,我不需要添加包含语句:只需在项目中包含框架就足够了。

问题在于 Apple 的 LAPACK 无法识别_dgetrf,而是在寻找dgetrf_。此外,所有内容都必须通过引用传递。

文档可以在这里找到: Vector Libraries

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2010-12-26
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    相关资源
    最近更新 更多