我在头文件和源文件中有这段代码。以下是代码的一小段内容。这来自.cpp
文件。
int sample(Cdf* cdf)
{
//double RandomUniform();
double r = RandomUniform(); //code that is causing the error
for (int j = 0; j < cdf->n; j++)
if (r < cdf->vals[j])
return cdf->ids[j];
// return 0;
}
这来自.c
文件:
double RandomUniform(void)
{
double uni;
/* Make sure the initialisation routine has been called */
if (!test)
RandomInitialise(1802,9373);
uni = u[i97-1] - u[j97-1];
if (uni <= 0.0)
uni++;
u[i97-1] = uni;
i97--;
// ...
}
这是来自我的头文件
void RandomInitialise(int,int);
double RandomUniform();
double RandomGaussian(double,double);
int RandomInt(int,int);
double RandomDouble(double,double);
我在#include "headerfile.h"
文件中使用了.cpp
然后编译了代码。从代码片段中可以看出,我基本上调用RandomUniform()
文件中的函数.cpp
,然后在头文件中定义它。
问题是,每当我构建程序时,我都会得到一个“未定义的函数引用”错误。 这是我得到的错误
In function 'Z6sampleP3Cdf':
undefined reference to 'RandomUniform()'
有人有任何想法吗?
答案 0 :(得分:5)
请记住C ++ mangles 的功能名称。因此,C ++中名为sample
的函数在C中的名称不会相同。
当然,对话中,像C中的void RandomInitialise(int,int)
这样的函数不会简单地在C ++中命名为RandomInitialise
。
您必须将extern "C"
用于在C中实现的函数,否则C ++编译器将为您的C函数创建错位名称。
因此,您必须将包含以下仅C函数的头文件更改为:
extern "C" void RandomInitialise(int,int);
extern "C" double RandomUniform(void);
extern "C" double RandomGaussian(double,double);
extern "C" int RandomInt(int,int);
extern "C" double RandomDouble(double,double);
当然,这意味着您不能使用纯C项目中的相同头文件,因为extern "C"
在纯C编译器中无效。但您可以使用预处理器来帮助解决这个问题:
#ifdef __cplusplus
extern "C" {
#endif
void RandomInitialise(int,int);
double RandomUniform(void);
double RandomGaussian(double,double);
int RandomInt(int,int);
double RandomDouble(double,double);
#ifdef __cplusplus
}
#endif
答案 1 :(得分:0)
如果您没有在创建文件时将文件添加到调试和发布中!那就是问题所在!
cpp文件需要链接和添加!如果不在调试和|或发布之内!链接器找不到它们!
如果它们已经创建!在文件资源管理器中离开!右键点击!并选择属性! 在属性中选择构建!您会在哪里找到调试和发布的地方!
不需要添加外部字符“ C”!我确认!链接器链接没有问题!
仍然检查此答案
答案 2 :(得分:-4)
右键单击此处,然后“添加文件”,然后选择要编辑其文件传递的.h和.c文件,然后按OK。