1

このコードは、ヘッダーファイルとソースファイルにあります。これがコードの小さな断片です。これは.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()'

誰かが何か考えがありますか?

4

3 に答える 3

5

C++はその関数名を壊すことを忘れないでください。したがって、sampleC ++で名前が付けられた関数は、Cで同じ名前が付けられません。

そしてもちろん、Cのような関数は、C++ではvoid RandomInitialise(int,int)単純に名前が付けられるわけではありません。RandomInitialise

Cで実装された関数に使用する必要があります。そうしないとextern "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);

もちろん、これはextern "C"、純粋な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
于 2013-03-16T22:20:57.877 に答える
2

ファイルの作成時にデバッグおよびリリースするファイルを追加しなかった場合!それならそれが問題になるでしょう!

cppファイルをリンクして追加する必要があります!デバッグおよび|またはリリースの範囲外の場合!リンカはそれらを見つけられません!

それらをデバッグまたはリリースするために追加する方法

それらがすでに作成されている場合!ファイルエクスプローラーで左!右クリック!そして、プロパティを選択してください!プロパティ内でビルドを選択してください!デバッグとリリースを追加する場所が見つかります!

ここに画像の説明を入力してください ここに画像の説明を入力してください

extern「C」についての注意

extern "C"を追加する必要はありません!そして、私はそれを確認します!リンカーリンクは問題ありません!

まだこの答えを確認してください

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

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

于 2020-06-28T09:47:12.270 に答える
-4

ここをクリックして「ファイルを追加」し、ファイルパスを編集する.hおよび.cファイルを選択して、「OK」を押します。

押す場所を確認するには、ここをクリックしてください

于 2019-12-15T21:26:36.203 に答える