【问题标题】:Linker error calling C function from C++ despite using EXTERN "C"尽管使用了 EXTERN "C",但从 C++ 调用 C 函数的链接器错误
【发布时间】:2013-09-03 12:28:21
【问题描述】:

我正在使用这个库 http://rtmpdump.mplayerhq.hu/librtmp.3.html 是用 C 语言编写的。 它已经在其所有定义中使用了 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。并且没有编译错误。 我错过了什么?

【问题讨论】:

  • 这个错误之前的编译行是什么? (IOW,我很确定您没有包含包含此功能的库/目标文件)
  • 没有编译错误,因为它是抱怨的链接器。你真的链接到图书馆吗?
  • 你是否正确地告诉你的编译器链接到 librtmp 库?它必须类似于编译器命令行调用上的 -lrtmp。
  • 如果一切都如您所说,那么问题是您的构建设置不正确。很可能您没有告诉链接器与库链接。
  • 你需要自己添加库文件名(我认为是链接器/输入到不同的地方)

标签: c++ c visual-studio-2008 linker-errors


【解决方案1】:

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

first.c

#include "first.h"

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

second.cpp

#include "first.h"

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

        result = RTMP_Alloc();

        return  0;
}

first.h

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

struct RTMP     *RTMP_Alloc();

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

【讨论】:

  • 有趣的是,即使这样也已经被处理掉了。
  • 可能我对在“包含目录”、“库目录”、“外部依赖项”、“头文件”等中提及的内容感到困惑。我对 Visual Studio 很陌生,我正在工作现在就开始吧,我肯定会分享我的发现。
猜你喜欢
  • 2012-03-09
  • 2022-01-22
  • 1970-01-01
  • 2021-12-13
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
相关资源
最近更新 更多