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

问题描述 投票:0回答:1

我有一个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文件中定义为外部的函数时是否存在任何问题?

c++ c linker c++-cli extern
1个回答
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)防护符]

© www.soinside.com 2019 - 2024. All rights reserved.