0

同じタイトルの他の質問があることは知っていますが、私と同じ問題を抱えている質問はありません。

私には2つのプロジェクトがあります。1つはライブラリを構築し、もう1つはそのライブラリを使用するアプリを構築します。

私がライブラリを構築するとき、それはすべて大丈夫です。ライブラリを含む.aファイルを作成します。2番目のプロジェクトをビルドしようとすると、次のメッセージが表示されます。

Undefined symbols for architecture armv7:
  "_SPLite3_rtree_geometry_callback", referenced from:
      _register_spatialite_sql_functions in liblibspatialite.a(spatialite.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

それは良くないね。最初はそれが何について話しているのかわかりませんでしたが、調査の結果、ライブラリがarmv7用に構築されていない可能性があることがわかったため、lipoコマンドを使用してアーキテクチャを確認しました。

lipo -info liblibspatialite.a

これにより、次の出力が生成されます。

Non-fat file: liblibspatialite.a is architecture: armv7

さて、アーキテクチャは正しいです。じゃあ何?たぶん、ライブラリに準拠する.oファイルのシンボルを確認してください。そのために、nmコマンドを使用しました。

nm spatialite.o | grep SPLite3_rt

これにより、次の出力が生成されます。

U _SPLite3_rtree_geometry_callback

nmのマンページを確認したところ、記号の前のUは未定義であることを意味していることがわかりました。だから、それだけのようです。シンボルは未定義として表示されます。別のワークスペースに別のバージョンのプロジェクトがあります。確認したところ、動作するライブラリが生成されます。nmコマンドは、他のバージョンで次を返します。

0000e5f6 T _SPLite3_rtree_geometry_callback
0018c668 S _SPLite3_rtree_geometry_callback.eh

したがって、このライブラリでは機能しており、問題ありません。私は両方のプロジェクトのビルドオプションの違いを見つけようとしましたが、それらは私には同じように見えます。プロジェクトのプロパティのコンパイラセクションにライブラリのソースファイルを含めると、ライブラリの最初のバージョンでビルドできます。([ターゲット]->[ビルドフェーズ]->[ソースのコンパイル]を選択します)が、それはライブラリを使用する意味ではないと思います。

そこで、_SPLite3_rtree_geometry_callbackがライブラリに含まれるようにするにはどうすればよいか知りたいです。

前もって感謝します。

編集:

いくつかのより多くの情報。Spatialite.cには、次のコードがあります。

#define sqlite3_rtree_geometry_callback SPLite3_rtree_geometry_callback

SQLITE_API int sqlite3_rtree_geometry_callback(
sqlite3 *db,
  const char *zGeom,
  int (*xGeom)(sqlite3_rtree_geometry *, int nCoord, double *aCoord, int *pRes),
  void *pContext
);

編集2:

メソッドのコード:

/*
** Register a new geometry function for use with the r-tree MATCH operator.
*/

SQLITE_API int sqlite3_rtree_geometry_callback(
  sqlite3 *db,
  const char *zGeom,
  int (*xGeom)(sqlite3_rtree_geometry *, int, double *, int *),
  void *pContext
){
  RtreeGeomCallback *pGeomCtx;      /* Context object for new user-function */

  /* Allocate and populate the context object. */
  pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback));
  if( !pGeomCtx ) return SQLITE_NOMEM;
  pGeomCtx->xGeom = xGeom;
  pGeomCtx->pContext = pContext;

  /* Create the new user-function. Register a destructor function to delete
  ** the context object when it is no longer required.  */
  return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY, 
      (void *)pGeomCtx, geomCallback, 0, 0, doSqlite3Free
  );
}
4

3 に答える 3

0

spacialite.cライブラリのターゲットに追加されていることを確認してください。

于 2012-08-30T14:44:54.017 に答える
0

プリプロセッサ マクロで SQLITE_ENABLE_RTREE を指定する必要があります

于 2012-08-30T16:12:24.910 に答える
0

Ok。これは奇妙に思えますが、最終的に修正したようです。すべてが正しく定義されているため、なぜ機能しないのかわかりません。

プリプロセッサ マクロを定義するために、xcode ターゲット設定を使用していました。その代わりに、SQLITE_ENABLE_RTREE を .pch ファイルに変更しました。その後、ビルドに不足しているシンボルが含まれています。

于 2012-09-03T09:44:17.753 に答える