我有一个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 libs包含在此应用程序中。但是在编译SampleViewer时,出现以下错误:
libsample-sdk-x86.lib(sample_sdk_source.obj):错误LNK2019:未解析的外部符号“ int __cdecl get_sample_value()”(?get_sample_value @@ YAPBUint @@ XZ)在函数“ public”中引用:静态无效__cdecl do_processing()“(?do_processing @@ SAXXZ)
我还尝试过使用SampleViewer :: main.cpp文件中的相同功能,但是存在相同的错误。从C ++ / CLI环境访问C文件中定义为外部的函数时是否存在任何问题?
链接器错误说明了一切:
extern int get_sample_value();
声明为mangled名称?get_sample_value@@YAPBUint@@XZ
]设置了未定义的符号_get_sample_value
)的符号。要解决此问题,请在C ++中也用extern "C"
标记您的声明,或者更好的方法是:将声明移到sample.c和sample_sdk_source.cpp都可以包含的标头中(使用#if defined(__cplusplus)
防护符]