[英]Undefined reference to function in Codeblocks
我在頭文件和源文件中有這段代碼。 這是代碼的小片段。 這是來自.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);
我在.cpp
文件中使用了#include "headerfile.h"
,然后我編譯了代碼。 正如您從片段中看到的,我基本上是調用.cpp
文件中的函數RandomUniform()
然后在頭文件中定義它。
問題是,每當我構建程序時,都會收到“未定義的函數引用”錯誤。 這是我得到的錯誤
In function 'Z6sampleP3Cdf':
undefined reference to 'RandomUniform()'
有人有什么想法嗎?
請記住,C ++軋液的函數名。 所以在 C++ 中名為sample
的函數在 C 中不會被命名為相同的。
當然相反,C 中像void RandomInitialise(int,int)
這樣的函數在 C++ 中不會簡單地命名為RandomInitialise
。
對於用extern "C"
實現的函數,您必須使用extern "C"
,否則 C++ 編譯器將為您的 C 函數創建重整名稱。
因此,您必須將包含這些 C-only 函數的頭文件更改為:
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
如果您沒有在文件創建時將文件添加到調試和發布! 那么問題就來了!
需要鏈接和添加cpp文件! 如果不在調試和|或發布中! 鏈接器不會找到它們!
如果它們已經創建! 在文件瀏覽器左側! 右鍵點擊! 並選擇屬性! 在屬性中選擇構建! 您將找到添加調試和發布的位置!
添加 extern "C" 不是必需的! 我確認! 鏈接器鏈接沒有問題!
仍然檢查這個答案
右鍵單擊此處,然后“添加文件”,然后選擇要編輯其文件傳遞的 .h 和 .c 文件,然后按確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.