【问题标题】:missing symbols that should be there缺少应该存在的符号
【发布时间】:2011-01-06 07:02:27
【问题描述】:

我被难住了。这是 ld 的输出。

/usr/lib/libvisual-0.6/actor/actor_avs_superscope.so: undefined reference to `visual_mem_free'
/usr/lib/libvisual-0.6/actor/actor_avs_superscope.so: undefined reference to `visual_mem_malloc0'

这里是宏:

#define visual_mem_new0(struct_type, n_structs)           \
    ((struct_type *) visual_mem_malloc0 (((visual_size_t) sizeof (struct_type)) * ((visual_size_t) (n_structs))))

#define visual_mem_malloc(size)     \
    visual_mem_malloc_impl (size, __FILE__, __LINE__, __PRETTY_FUNCTION__)

#define visual_mem_malloc0(size)    \
    visual_mem_malloc0_impl (size, __FILE__, __LINE__, __PRETTY_FUNCTION__)

#define visual_mem_realloc(ptr, size)   \
    visual_mem_realloc_impl (ptr, size, __FILE__, __LINE__, __PRETTY_FUNCTION__)

#define visual_mem_free(ptr)        \
    visual_mem_free_impl (ptr, __FILE__, __LINE__, __PRETTY_FUNCTION__)

现在它没有加起来。一行说缺少visual_mem_free,这是一个宏。另一个说没有visual_mem_malloc0,但代码实际上调用了visual_mem_new0,这表明它看到了visual_mem_new0。

priv = visual_mem_new0 (SuperScopePrivate, 1);

visual_mem_free (priv);

有什么线索吗?

编辑:颠簸..也许一些新鲜的眼睛可以帮助?

编辑:顺便说一句,我在编译过程中没有收到警告/错误,也没有链接。

编辑:这是预处理器输出中的几个 sn-ps。

int lv_superscope_cleanup (VisPluginData *plugin)
{
 SuperScopePrivate *priv = visual_object_get_private ((((VisObject*) ((plugin)))));

 visual_mem_free_impl (priv, "actor_avs_superscope.c", 195, __PRETTY_FUNCTION__);

 return 0;
}

还有:

 priv = ((SuperScopePrivate *) visual_mem_malloc0_impl (((visual_size_t) sizeof (SuperScopePrivate)) * ((visual_size_t) (1)), "actor_avs_superscope.c", 152, __PRETTY_FUNCTION__));

看起来宏正在扩展。我糊涂了。 __PRETTY_FUNCTION__ 应该扩展吗?

有趣的是,这是字符串的输出。

$ strings .libs/actor_avs_superscope.so |grep malloc
visual_mem_malloc0_impl
visual_mem_malloc0
malloc

克里斯:我只是在运行ld /usr/lib/libvisual-0.6/actor/actor_avs_superscope.so

这是 nm 的输出:

$ nm actor_avs_superscope.o |grep malloc
         U visual_mem_malloc0_impl

$ nm actor_avs_superscope.o |grep free
         U visual_mem_free_impl
         U visual_palette_free_colors

【问题讨论】:

  • 产生这些错误的 ld 命令行是什么?尝试在进入 actor_avs_superscope.so 的所有 .o 文件上运行 nm,看看您是否可以找出哪些源文件正在生成对这些符号的引用。

标签: c linux symbols shared-objects


【解决方案1】:

在链接之前的预处理阶段处理宏。因此,如果链接编辑器向您发出有关宏名称的警告,则宏没有展开。

要查看预处理结果,可以使用 /E 标志。如果您的宏已展开,您将看到以下行:

visual_mem_free (priv);

改为:

visual_mem_free_impl(priv, "filename.c", 32, "main");

更新

从您的 nm/strings 输出中,文件 actor_avs_superscope.o 不是问题所在。还有哪些其他对象 (.o) 文件和静态档案 (.a) 用于创建 actor_avs_superscope.so?您应该对所有这些运行 nm 以查找其中有未扩展的宏名称的人。

【讨论】:

  • 我用 -E 编译,输出文件看起来像预处理器工作。我查看了一下,似乎宏扩展了。我会用文件中的内容更新问题。
  • 这是构建库的唯一目标文件。 actor_avs_superscope.o
  • 哦,等等,刚刚找到一个 .a 文件。这看起来是个问题。 (它是更大包装的一部分。)
  • 太棒了。如果您使用nm -A,nm 将包含每个符号所在的目标文件的名称。
【解决方案2】:

您的第一个错误是针对已安装的库/usr/lib/libvisual-0.6/actor/actor_avs_superscope.so,看起来您正在查看项目strings .libs/actor_avs_superscope.so 中的本地库。尝试对/usr/lib 中的字符串运行字符串,您可能会看到问题。

我要么安装你更新的库版本,要么在你运行它时将它的目录放在 LD_LIBRARY_PATH 中,比如$ LD_LIBRARY_PATH=./lib ./your_executable

【讨论】:

    【解决方案3】:

    C 代码中的宏不会在已编译的可执行文件中产生符号。可能正在发生的事情是您正在编译的某些代码没有#include 这些宏,因此编译器推断它们是函数,并编译了对它们的调用。您可以使用-Wall-Werror 使对未定义函数的调用无法编译。

    【讨论】:

    • 我收到了一些警告。摆脱了那些,但符号仍然丢失。此外,如果不包含文件,则对 visual_mem_new0 的调用将失败。
    • 是的,我用过它们,但在这种情况下它们没有帮助。就像我说的,我摆脱了所有的警告/错误。它使用这些标志进行编译,但我仍然遇到这个问题中提到的初始问题。
    【解决方案4】:

    感觉好像它没有阅读您的#defines - 尝试在它们之间打印一条消息以进行检查。

    还要检查文件的编译顺序;对visual_mem_new0 的调用是否在#defines 之后?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 2018-05-27
      • 2021-05-08
      • 1970-01-01
      相关资源
      最近更新 更多