【发布时间】: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 时。但它没有