【问题标题】:OpenCV 3.2.0 iOS Type Conversion: int to __CLPK_integer *OpenCV 3.2.0 iOS 类型转换:int 到 __CLPK_integer *
【发布时间】: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 *?

谢谢!

【问题讨论】:

    标签: c++ ios opencv casting


    【解决方案1】:

    &m 正在传入 2 个参数,第一个和第七个。

    似乎这样的事情应该可以工作:

    sgesv_((__CLPK_integer*)&m, &n, (float*)a, &lda, piv, (float*)b,(__CLPK_integer*)&m, info);
    

    您可能还需要转换参数 2、4、5 和 8。

    【讨论】:

    • 谢谢汤姆。永远不要低估新鲜眼睛的力量。我确实最终不得不强制转换所有参数。该调用现在看起来像这样:sgesv_( (__CLPK_integer*)&m, (__CLPK_integer*)&n, (float*)a, (__CLPK_integer*)&lda, piv, (float*)b, (__CLPK_integer*)&m, (__CLPK_integer* )&信息);
    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2013-05-23
    • 2011-12-24
    • 2012-05-10
    相关资源
    最近更新 更多