1

我正在使用这个用 C 编写的库 http://rtmpdump.mplayerhq.hu/librtmp.3.html。它已经在其所有定义中使用了 extern "C"。但是,当我从 [main.cpp] 文件中调用函数时,编译器仍会显示以下错误:

[1>main.obj : error LNK2028: unresolved token (0A00000F) "extern "C" struct RTMP * 
 __cdecl RTMP_Alloc(void)" (?RTMP_Alloc@@$$J0YAPAURTMP@@XZ) referenced in function "int 
 __cdecl main(void)" (?main@@$$HYAHXZ)]

[1>main.obj : error LNK2019: unresolved external symbol "extern "C" struct RTMP * 
 __cdecl RTMP_Alloc(void)" (?RTMP_Alloc@@$$J0YAPAURTMP@@XZ) referenced in function "int 
 __cdecl main(void)" (?main@@$$HYAHXZ)]

我使用的是 Visual Studio 2008。并且没有编译错误。我错过了什么?

4

1 回答 1

2

这是一个符合症状的场景。两个源文件和一个头文件。

第一个.c

#include "first.h"

struct RTMP     *RTMP_Alloc()
{
        return  (struct RTMP *) 0;
}

第二个.cpp

#include "first.h"

int main (int argc, char **argv)
{
        RTMP *result;

        result = RTMP_Alloc();

        return  0;
}

第一个.h

#ifdef __cplusplus
extern "C"
#endif
struct RTMP
{
        int val1;
        int val2;
} ;

struct RTMP     *RTMP_Alloc();

请注意,extern "C"only 适用于结构定义。要更正它,要么需要在RTMP_Alloc定义之前插入它,要么对于大块更容易,将其放入extern "C" { ... }构造中(注意添加了花括号)。

于 2013-09-04T03:57:11.337 回答