簡體   English   中英

代碼塊中對函數的未定義引用

[英]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" 的注意事項

添加 extern "C" 不是必需的! 我確認! 鏈接器鏈接沒有問題!

仍然檢查這個答案

https://stackoverflow.com/a/15455385/7668448

https://stackoverflow.com/a/15141021/7668448

右鍵單擊此處,然后“添加文件”,然后選擇要編輯其文件傳遞的 .h 和 .c 文件,然后按確定。

單擊此處查看按的位置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM