【问题标题】:Android NDK: Create a library with undefined functionAndroid NDK:创建一个未定义函数的库
【发布时间】:2014-11-12 23:29:15
【问题描述】:

我是 makefile 的新手。我正在尝试为 Box2D 制作一个 Android 生成文件。我对库进行了一些修改,它使用了我自己游戏中的一些次要数学函数。所以基本上我已经写了一个Box2D的文件:

extern float fastCos(float);
extern float fastSin(float);

但是我也尝试链接它的makefile,这不是我想要的,因为这两个功能是在我的游戏源代码中实现的,显然当时我只是在构建Box2D。我希望链接器仅在我编译整个游戏时链接这些函数。

我应该在 makefile 中做什么来实现这种类型的链接行为?我在网络上的其他 makefile 中看到过一些东西,例如“static_library”和“library”,这是我的问题的一部分吗?

【问题讨论】:

  • 您是单独构建 Box2D 还是作为 Android.mk 进程的一部分?
  • 是的,这就是我正在尝试的。为了避免再次重新编译box2d,如果我改变一些东西来制作我自己的游戏的makefile。正是 SDL 完成这项工作的方式。如果我更改自己的 makefile,则不会重新编译 SDL。它只会重新链接。
  • 链接中的信息有帮助吗?您需要构建某种动态或静态的库。 navaneeth.github.io/blog/2013/07/28/…
  • 不,并非如此,Android makefile 看起来与 CMake 文件完全不同。
  • 对不起,我不明白在库中声明但不定义函数的需要是什么......?您基本上是在使库成为客户端代码的客户端,这很奇怪。为什么不直接将您的数学外部化到您自己的库中并在 Box2D 中使用它?

标签: c++ makefile android-ndk linker


【解决方案1】:

经过几个小时的搜索并寻求朋友的帮助,我设法让它工作了。

它一直抱怨未定义引用的问题是因为Android makefile机制自动添加了这个链接器标志:

-Wl,--no-undefined

在 NDK 本身的 makefile 中删除该标志后,它编译得很好,正如预期的那样。但是,当然还有另一个问题。库 A 依赖于库 B,反之亦然,因此在运行时没有正确的动态链接顺序。因此,正如@JBL 还指出的那样,我所做的是为这些数学函数创建了另一个共享库 (M)。所以现在库 A 依赖于库 B 和 M,而库 B 仅依赖于 B。所以,现在我们可以按以下顺序加载:M、B、A。

完成此操作后,可以简单地将库 B 与这个新的 M 库链接,而无需删除链接器标志 --no-undefined。因为,现在一切就绪,我们不再有循环依赖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2018-02-24
    相关资源
    最近更新 更多