【问题标题】:LNK2019: Unresolved external symbol in C++/CLILNK2019:C++/CLI 中未解析的外部符号
【发布时间】:2019-10-18 09:02:26
【问题描述】:

我有一个 sample.c 文件,其中定义了一个非静态函数

来源:sample.c

#if defined(__cplusplus)
extern "C" {
#endif

int get_sample_value()
{
    return 1000;
}

#if defined(__cplusplus)
}
#endif

有一个纯 C++ SDK 项目,sample_sdk,它基本上生成了几个静态库,其中使用了 get_sample_value() 函数源文件之一如下:

来源:sample_sdk_source.cpp

extern int get_sample_value();

static void do_processing()
{
    int sample_value = get_sample_value();
    process( sample_value );
}

上述 sample.c 将在另一个 C++/CLI GUI 应用程序 SampleViewer 中编译,其中 sample_sdk 库包含在此应用程序中。 但是在编译 SampleViewer 时,我们收到以下错误:

libsample-sdk-x86.lib(sample_sdk_source.obj):错误 LNK2019: 未解析的外部符号“int __cdecl get_sample_value()” (?get_sample_value@@YAPBUint@@XZ) 在函数“public: static void __cdecl do_processing()" (?do_processing@@SAXXZ)

我也尝试使用 SampleViewer::main.cpp 文件中的相同函数,但存在相同的错误。 从 C++/CLI 环境中访问 C 文件中定义为 extern 的函数时有什么问题吗?

【问题讨论】:

  • 您应该在头文件中声明该函数并将头文件包含在两个源文件中,尽管您编写的内容将起作用。您还需要链接两个目标文件;这可能是你的主要问题。
  • @JonathanLeffler 感谢您的回答,但引入通用标头存在一些技术问题。
  • 找出解决这些技术问题的方法——任何真正大小的程序都需要标头。您不能跨文件重复代码(例如函数声明)——这很快就会成为维护的噩梦。
  • 欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请查看About 页面以及How do I ask questions here?What do I do when someone answers my question?

标签: c++ c linker c++-cli extern


【解决方案1】:

链接器错误说明了一切:

  • 您在 C++ 中的 extern int get_sample_value(); 声明为 mangled 名称 ?get_sample_value@@YAPBUint@@XZ 设置了一个未定义的符号
  • 您在 sample.c 中的定义定义了一个具有未损坏名称 (_get_sample_value) 的符号。

要解决这个问题,要么在 C++ 中也用 extern "C" 标记你的声明,或者更好:将声明移动到 sample.c 和 sample_sdk_source.cpp 都可以包含的标头中(使用 #if defined(__cplusplus) 保护)

【讨论】:

  • 我将声明移到 extern "C" 块,它工作正常。
猜你喜欢
  • 2012-12-17
  • 1970-01-01
  • 2015-08-26
  • 2014-11-07
  • 2013-06-01
  • 1970-01-01
  • 2018-07-04
  • 2022-01-06
  • 2014-09-19
相关资源
最近更新 更多