LNK2019:C++/CLI 中无法解析的外部符号

LNK2019: Unresolved external symbol in C++/CLI

我有一个 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) : error LNK2019: unresolved external symbol "int __cdecl get_sample_value()" (?get_sample_value@@YAPBUint@@XZ) referenced in function "public: static void __cdecl do_processing()" (?do_processing@@SAXXZ)

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

链接器错误说明了一切:

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

要解决这个问题,要么在 C++ 中也用 extern "C" 标记你的声明,或者更好:将声明移到 header 中,同时 sample.c 和 sample_sdk_source.cpp 可以包括(使用 #if defined(__cplusplus) 守卫)