【发布时间】:2018-02-03 02:21:00
【问题描述】:
我正在尝试将 OpenCV 3.2.0 实现为 iOS 应用程序内的静态库。我在我的工作区中创建了一个opencv.xcodeproj 项目来构建静态库,然后我将其链接到我的主应用程序项目,如下所示:
由于类型转换错误,opencv_core 中的文件 hal_internal.cpp 将无法编译。这是问题代码的示例,已缩短:
lapack_LU(fptype* a, size_t a_step, int m, fptype* b, size_t b_step, int n, int* info)
{
int lda = (int)(a_step / sizeof(fptype)), sign = 0;
int* piv = new int[m];
transpose_square_inplace(a, lda, m);
if(b)
{
if(n == 1 && b_step == sizeof(fptype))
{
if(typeid(fptype) == typeid(float))
sgesv_(&m, &n, (float*)a, &lda, piv, (float*)b, &m, info);
}
}
}
编译器错误为No matching function for call to sgesv_,因为m 参数(int)不是__CLPK_integer 类型。
这是函数签名:
int sgesv_(__CLPK_integer *__n, __CLPK_integer *__nrhs, __CLPK_real *__a,
__CLPK_integer *__lda, __CLPK_integer *__ipiv, __CLPK_real *__b,
__CLPK_integer *__ldb,
__CLPK_integer *__info) __OSX_AVAILABLE_STARTING(__MAC_10_2,
__IPHONE_4_0);
__CLPK_integer在Accelerate框架的clapack.h中定义为:
#if defined(__LP64__) /* In LP64 match sizes with the 32 bit ABI */
typedef int __CLPK_integer;
...
#else
typedef long int __CLPK_integer;
...
#endif
如果我尝试创建一个缓冲区并改用它:
__CLPK_integer newM = m;
...
sgesv_(&newM, &n, (float*)a, &lda, piv, (float*)b, &m, info);
我得到相同的编译器错误。
如果我尝试
__CLPK_integer* newM = (int*)m;
...
sgesv_(newM, &n, (float*)a, &lda, piv, (float*)b, &m, info);
编译器可以找到函数sgesv_,但在newM 声明处发出错误:
Cannot initialize a variable of type '__CLPK_integer *' (aka 'long *') with an rvalue of type 'int *'
另外,为什么编译器认为__CLPK_integer 现在是aka 'long *'?
如果我改为尝试强制转换 __CLPK_integer* newM = (long*)m;,我会得到同样的错误,但编译器认为 __CLPK_integer 是 aka 'int *'。
我反对 Generic iOS Device 和 Build Active Architecture Only 设置为是。
如何将 int m 转换为预期的类型 __CLPK_integer *?
谢谢!
【问题讨论】: