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

C++ LNK2019:C+中未解析的外部符号+/CLI,c++,c,linker,c++-cli,extern,C++,C,Linker,C++ Cli,Extern,我有一个sample.c文件,其中定义了一个非静态函数 资料来源:sample.c #if defined(__cplusplus) extern "C" { #endif int get_sample_value() { return 1000; } #if defined(__cplusplus) } #endif 有一个纯粹的C++SDK项目,sample\u SDK基本上生成了几个静态lib,其中get\u sample\u value()函数在一个源文件中使用,如下所示:

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

资料来源:sample.c

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

int get_sample_value()
{
    return 1000;
}

#if defined(__cplusplus)
}
#endif
有一个纯粹的C++SDK项目,sample\u SDK基本上生成了几个静态lib,其中get\u sample\u 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++/CLIGUI应用程序中编译,SampleViewer其中sample\u sdk库包含在此应用程序中。 但在编译SampleViewer时,我们会遇到以下错误:

libsample-sdk-x86.lib(sample\u sdk\u source.obj):错误LNK2019: 未解析的外部符号“int\uu cdecl get\u sample\u value()” 函数“public: 静态void\uuu cdecl do\u processing()“(?do\u processing@@SAXXZ)

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

链接器错误说明了一切:

  • 您的
    extern int获取样本值() C++中的声明为已损坏名称“代码>?GETY-SAMPLE值@ @ YAPBUTIN @ @ XZ < /代码> 
  • 设置了未定义的符号。
  • 您在sample.c中的定义定义了一个具有非损坏名称的符号(
    \u get\u sample\u value

解决这个问题,或者用C++来标记您的声明,同时使用代码>外部“C”/代码>,或者更好的是:将声明移动到Simult.C和SAMPLE SDKXSOURCE.CPP都可以包括的头(包含“代码”>“如果定义”(“AX-CPLUS PLUS”< /CODE> GARED)

>您应该在头文件中声明该函数,并将头包含在两个源文件中,虽然你写的会有用。您还需要链接两个对象文件;这可能是你的主要问题。@JonathanLeffler感谢你的回答,但是引入一个通用的标题有一些技术问题。找出解决这些技术问题的方法——任何实际大小的程序都需要标题。您不能在文件之间重复代码(如函数声明),这很快就会成为维护的噩梦。欢迎使用堆栈溢出。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请看页面,我把声明移到了extern“C”块,效果很好。