2017-08-25 10 views
1

OpenCV 3.2.0をiOSアプリケーションの静的ライブラリとして実装しようとしています。OpenCV 3.2.0 iOSタイプ変換:intから__CLPK_integer *

workspace structure

static library linking

ファイルhal_internal.cppopencv_coreにコンパイルされません。私はそのようにように、私のメインのアプリのプロジェクトにリンクする静的ライブラリを構築するために私のワークスペース内opencv.xcodeprojプロジェクトを作成しました型変換エラーが原因です。これは短く、問題のあるコードのサンプルである:

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); 
     } 
    } 
} 

intあるmパラメータは、タイプ__CLPK_integerではないので、コンパイラエラーがNo matching function for call to sgesv_です。

これは、関数のシグネチャである:私はバッファを作成して、代わりにそれを使用しようとする

#if defined(__LP64__) /* In LP64 match sizes with the 32 bit ABI */ 
    typedef int   __CLPK_integer; 
    ... 
#else 
    typedef long int __CLPK_integer; 
    ... 
#endif 

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は、次のように加速枠組みの中clapack.hで定義されている

__CLPK_integer newM = m; 

... 

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

同じコンパイラエラーが発生します。

私は、コンパイラがnewM宣言で機能sgesv_が、問題のエラーを見つけることができます

__CLPK_integer* newM = (int*)m; 

... 

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

をしようとした場合:

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 DeviceBuild Active Architecture Onlyを「はい」に設定しています。

int mを予想されるタイプに変換する方法__CLPK_integer *

ありがとうございます!

答えて

1

& mは、1番目と7番目のパラメータの2つが渡されています。このようなものが動作するはずのよう

は思え:

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

ます。また、パラメータ2、4、5と8

+0

をキャストする必要があるかもしれませんトムありがとうございます。新鮮な目の力を絶対に過小評価しないでください。 実際にすべてのパラメータをキャストする必要がありました。その呼び出しは次のようになります。 sgesv_( \t \t \t \t \t(__CLPK_integer *)&M、 \t \t \t \t \t(__CLPK_integer *)&N、 \t \t \t \t \t(フロート*)A、 \t \t \t \t \t(__CLPK_integer *)< \t \t \t \t \t PIV、 \t \t \t \t \t(フロート*)B、\t \t \t \t \t (__CLPK_integer *)&M、\t \t \t \t \t (__CLPK_integer *)&インフォメーション \t \t \t \t \t)。 – Erwin

関連する問題