【问题标题】:Linker can't find function链接器找不到函数
【发布时间】:2016-09-07 10:21:57
【问题描述】:

我正在尝试基于我已经正确构建的 Aosp 树构建一个 Ubuntu Touch 树。 它失败并出现此错误

CAPEWrapper.cpp:16:错误:未定义对“__xlog_buf_printf”的引用

这是文件包含的标题

#include "CAPEWrapper.h"

级联包括

#include <cutils/xlog.h>

反过来又定义了

#if defined(__cplusplus)
extern "C" {
#endif

int __xlog_buf_printf(int bufid, const struct xlog_record *rec, ...);

#if defined(__cplusplus)
}
#endif

我怀疑我的 g++ 没有设置 __cplusplus 宏。这种错误会是一个现实的场景吗?如果这可能是问题所在,我是否需要使用“stdc=something”指定标准实现来解决它?

欢迎任何其他想法。

【问题讨论】:

  • xlog.h 中的代码只是一个函数声明,而不是函数定义。该函数必须在其他地方定义,要么在需要编译到项目中的 .c/.cpp 文件中,要么在要链接的库中。有 cutils/xlog.c* 文件吗?
  • 整个树中没有 xlog.c*。由于这个项目很大,你能告诉我一个 grep 模式来查找函数的定义位置吗? OT 仅据我所知:如果问题是编译器不应该找到函数声明,会出现什么错误?
  • 如果没有xlog.c*,那么该函数很可能是定义在需要链接的库中,而不是需要编译的源文件中。在这种情况下,头文件的存在只是告诉编译器该名称的函数存在并且具有指定的参数类型和返回类型,然后编译器依赖链接器来链接包含函数实际代码的库。因此,我建议您尝试 Jeremy 发布的解决方案。

标签: android c++ gcc


【解决方案1】:

确保您的项目正在链接libcutils,并且它以正确的顺序链接它(即-lcutils 出现在链接器命令行中任何依赖它的模块之后) .

【讨论】:

  • 这是构建项目 LOCAL_SHARED_LIBRARIES 的 Android.mk 的摘录 := \ libbinder \ libutils \ libcutils \ libdl \ libui 如您所见,libcutils 在宏中。
  • 链接顺序,谢谢!我选择的项目生成器不会根据依赖项对链接进行排序,它们是按字母顺序而不是按依赖项排序的。谢谢你提醒我。
【解决方案2】:

最后,我发现模块列在一个名为 LOCAL_WHOLE_STATIC_LIBRARIES 的宏中,在 Android 环境中,该宏将其内容传递给 GCC 链接器的 --whole-archive 标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 2023-04-08
    • 1970-01-01
    • 2013-08-12
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多