【发布时间】:2019-10-18 09:02:26
【问题描述】:
我有一个 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):错误 LNK2019: 未解析的外部符号“int __cdecl get_sample_value()” (?get_sample_value@@YAPBUint@@XZ) 在函数“public: static void __cdecl do_processing()" (?do_processing@@SAXXZ)
我也尝试使用 SampleViewer::main.cpp 文件中的相同函数,但存在相同的错误。 从 C++/CLI 环境中访问 C 文件中定义为 extern 的函数时有什么问题吗?
【问题讨论】:
-
您应该在头文件中声明该函数并将头文件包含在两个源文件中,尽管您编写的内容将起作用。您还需要链接两个目标文件;这可能是你的主要问题。
-
@JonathanLeffler 感谢您的回答,但引入通用标头存在一些技术问题。
-
找出解决这些技术问题的方法——任何真正大小的程序都需要标头。您不能跨文件重复代码(例如函数声明)——这很快就会成为维护的噩梦。
-
欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请查看About 页面以及How do I ask questions here? 和What do I do when someone answers my question?
标签: c++ c linker c++-cli extern