【问题标题】:Linker error when using a struct variable使用结构变量时的链接器错误
【发布时间】:2012-05-08 21:15:51
【问题描述】:

当我尝试编译下面的程序时,我得到一个链接器错误:

/tmp/ccAikIsV.o    undefined reference to uvlc_encode_blockline

我已经声明并定义了所有结构 video_controller_t .. etc

int uvlc_encode_blockline(struct video_controller_t* controller, const struct    vp_api_picture_t* blockline, bool_t picture_complete );
int uvlc_decode_blockline(struct video_controller_t* controller,struct vp_api_picture_t* picture, bool_t* got_image );
int uvlc_update( struct video_controller_t* controller );
int uvlc_cache( struct video_controller_t* controller,struct video_stream_t* ex_stream);

const uvlc_codec_t uvlc_codec = {
uvlc_encode_blockline,
uvlc_decode_blockline,
uvlc_update,
uvlc_cache,
{ 0 }
};

如果有人有任何建议,请告诉我。


更新

我同意我们应该定义函数来告诉链接器获取并使用它。当我做类似的事情时,我没有收到任何错误。我声明了函数指针:

typedef C_RESULT (encode_blockline_fc)(struct video_controller_t controller,
                                       const struct vp_api_picture_t* blockline,
                                       bool_t picture_complete);

并在下面的结构中使用它:

typedef struct _video_codec_t
{
    encode_blockline_fc encode_blockline;
    decode_blockline_fc decode_blockline;
    update_fc update;
    cache_stream_fc cache_stream;
} video_codec_t;

如果以下语法有任何错误,请告诉我:

const uvlc_codec_t uvlc_codec = {
uvlc_encode_blockline,
uvlc_decode_blockline,
uvlc_update,
uvlc_cache,
{ 0 }
};

我同意我们应该定义函数来告诉链接器获取并使用它。当我做类似的事情时,我没有收到任何错误。我声明了函数指针 typedef C_RESULT (encode_blockline_fc)( struct video_controller_t controller, const struct vp_api_picture_t* blockline, bool_t picture_complete); 并在下面的结构中使用它 typedef struct _video_codec_t { encode_blockline_fc encode_blockline; decode_blockline_fc decode_blockline; update_fc 更新; cache_stream_fc 缓存流; }video_codec_t

如果以下语法有任何错误,请告诉我: 常量 uvlc_codec_t uvlc_codec = { uvlc_encode_blockline, uvlc_decode_blockline, uvlc_update, uvlc_cache, {0} };

【问题讨论】:

  • 函数在哪里:uvlc_encode_blockline,uvlc_decode_blockline,uvlc_update,uvlc_cache?
  • 语法没有错。如果有,您将不会收到链接器错误;你会得到一个编译器错误。我们可以争辩说结构标签上不应该有一个前导下划线(以下划线开头的标识符是为“实现”保留的),但这是次要的,当然,许多人无视该规则,风险自负。问题根本不是语法。问题是链接器找不到您告诉它用来提供指向结构中函数的指针的函数。它在哪个文件中实现?你为什么不把那个文件也链接起来?
  • IIRC,const 修饰符在 C++ 中的行为不同。您是否有机会使用 C++ 编译器进行编译?
  • 嗨 Wildplasser,我使用的是 gcc 而不是 g++。所以我想知道语法 const uvlc_codec_t ...另外,如果是链接器错误,它应该抱怨 typedef C_RESULT (encode_blockline_fc)( struct video_controller_t controller, const struct vp_api_picture_t* blockline, bool_t picture_complete );当未定义函数 encode_blockline_fc 时。但它没有

标签: c linker


【解决方案1】:

链接器抱怨一个未解析的函数引用,而不是结构。您应该向链接器传递一个包含此函数的目标文件或库,或者在当前编译单元中定义它。

【讨论】:

    【解决方案2】:

    链接器错误的可能性很小-

    1-如果您未能在链接过程中包含所有必要的目标文件。

    2-如果一个类、函数或变量有多个定义。

    所以检查一下。

    【讨论】:

      【解决方案3】:

      你告诉编译器函数 uvlc_encode_blockline() 存在于某个地方,但是当链接器去寻找它时,它实际上找不到它——所以它抱怨它找不到它。

      声明足以让源文件编译为目标代码。要链接程序,您实际上必须定义函数并将包含定义的目标文件与引用它的目标文件链接。

      【讨论】:

      • 我同意你的看法。但是当我做类似的事情时,我没有得到任何错误。我声明了函数指针 typedef C_RESULT (encode_blockline_fc)( struct video_controller_t controller, const struct vp_api_picture_t* blockline, bool_t picture_complete );并在下面的结构中使用它 typedef struct _video_codec_t { encode_blockline_fc encode_blockline; decode_blockline_fc decode_blockline; update_fc 更新; cache_stream_fc 缓存流; }video_codec_t ;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      相关资源
      最近更新 更多