首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缺少本应存在的符号

缺少本应存在的符号
EN

Stack Overflow用户
提问于 2010-01-18 17:11:28
回答 4查看 258关注 0票数 1

我被难住了。下面是ld的输出。

代码语言:javascript
复制
/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'

下面是宏:

代码语言:javascript
复制
#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。

代码语言:javascript
复制
priv = visual_mem_new0 (SuperScopePrivate, 1);

visual_mem_free (priv);

有什么线索吗?

编辑:颠簸..也许一些新鲜的眼睛能帮上忙?

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

编辑:下面是来自预处理器输出的几个代码片段。

代码语言:javascript
复制
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;
}

和:

代码语言:javascript
复制
 priv = ((SuperScopePrivate *) visual_mem_malloc0_impl (((visual_size_t) sizeof (SuperScopePrivate)) * ((visual_size_t) (1)), "actor_avs_superscope.c", 152, __PRETTY_FUNCTION__));

看起来宏正在被展开。我很困惑。__PRETTY_FUNCTION__应该是扩展的吗?

有趣的是,以下是字符串的输出。

代码语言:javascript
复制
$ 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的输出:

代码语言:javascript
复制
$ 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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-19 04:30:24

宏是在链接之前的预处理阶段处理的。因此,如果链接编辑器给出了有关宏名称的警告,那么宏就没有展开。

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

代码语言:javascript
复制
visual_mem_free (priv);

更改为类似以下内容:

代码语言:javascript
复制
visual_mem_free_impl(priv, "filename.c", 32, "main");

更新

从您的nm/strings输出来看,文件actor_avs_superscope.o不是问题所在。还可以使用哪些其他对象(.o)文件和静态归档(.a)来创建actor_avs_superscope.so?您应该在所有这些文件上运行nm,以便找出谁有未展开的宏名称。

票数 1
EN

Stack Overflow用户

发布于 2010-01-19 03:15:14

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

票数 3
EN

Stack Overflow用户

发布于 2010-01-18 17:16:18

感觉它不是在读取你的#defines --尝试在它们之间打印一条消息以进行检查。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2084890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档