xcode上的未定义符号,带有ios的自定义库(符号的定义在那里)

时间:2012-08-30 13:53:00

标签: ios xcode linker

我知道同样的标题还有其他问题,但没有一个问题比我有同样的问题。

我有两个项目。其中一个构建了一个库,另一个构建了一个使用该库的应用程序。

当我构建库时,一切都好。它创建一个包含库的.a文件。当我尝试构建第二个项目时,我收到以下消息:

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

3 个答案:

答案 0 :(得分:0)

检查spacialite.c是否已添加到库的目标。

答案 1 :(得分:0)

您必须在preproccessor宏

中指定SQLITE_ENABLE_RTREE

答案 2 :(得分:0)

确定。这看起来很奇怪,但看起来我终于修复了它。一切都是正确定义的,为什么它不起作用我不知道。

我使用xcode目标首选项来定义预处理器宏。而不是那样,我将SQLITE_ENABLE_RTREE更改为.pch文件,之后构建包含缺少的符号。