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)
守卫)
我有一个 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)
守卫)