同じタイトルの他の質問があることは知っていますが、私と同じ問題を抱えている質問はありません。
私には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
);
}