1

このよくあるエラーに出くわし、プログラムをコンパイルしています。私はすでにインターネットで多くの提案を試しましたが、これまでのところどれもうまくいきませんでした. CMD と Code::Blocks を介して g++ を使用してコードをコンパイルしようとしましたが、どちらも同じエラーが発生します。

C:\Users\Damian\Desktop\test program.cpp|17|undefined reference to `level1::segout(int, double, double)'

すべてのcppファイルを使用してCMDでコンパイルしようとしました:

g++ "main program.cpp" "level1.cpp" -o "test.exe"

以下は私のコードです...おそらく何か明らかなものが欠けています。C/C++ コーディングをするのは久しぶりです。

メインプログラム.cpp

#define _USE_MATH_DEFINES

#include <iostream>
#include <C:\Users\Damian\Desktop\level1.h>
#include <string>
#include <math.h>
using namespace std;

int main()
{
    double pitch = 0;
    double yaw = 0;
    cout << "Low-Level Test Program\nPlease enter the pitch value (in degrees):\n";
    cin >> pitch;
    cout << "Please enter the yaw value (in degrees):\n";
    cin >> yaw;
    level1::segout(0, pitch * (M_PI/180), yaw * (M_PI/180));
    return 0;
}

level1.h

//all dimensions in MM, all angles in RADIANS

#pragma once

class level1 {
        static const double LENGTH_NEUTRAL, ANGLE_MAX, RADIUS, WIRE_RADIUS, ENCODER_RES;
        double L1, L2, L3;
    public:
        static void segout(int, double, double);
};

level1.cpp

#define _USE_MATH_DEFINES

#include <iostream>
#include <math.h>
#include <stdlib.h>
//#include <level0.h> --not implemented yet
using namespace std;

const double LENGTH_NEUTRAL = 30;
const double ANGLE_MAX = M_PI/4;
const double RADIUS = 16;
const double WIRE_RADIUS = 0.1;
const double ENCODER_RES = (2*M_PI)/64;

void segout(int Seg, double P, double Y)
{
    //work area check
    if (sqrt(pow(P, 2) + pow(Y, 2)) <= LENGTH_NEUTRAL + ANGLE_MAX)
    {
        cout << "ERROR (0001): Specified coordinates are outside work area.\n";
        return;
    }

    //conversion

    //stage 1
    double L1 = LENGTH_NEUTRAL * (1 - ((sqrt(pow(P, 2) + pow(Y, 2)))/LENGTH_NEUTRAL) * RADIUS * sin((M_PI/2)+atan2(P, Y)));

    double L2 = LENGTH_NEUTRAL * (1 + ((sqrt(pow(P, 2) + pow(Y, 2)))/LENGTH_NEUTRAL) * RADIUS * sin((5*M_PI/6)+atan2(P, Y)));

    double L3 = LENGTH_NEUTRAL * (1 + ((sqrt(pow(P, 2) + pow(Y, 2)))/LENGTH_NEUTRAL) * RADIUS * cos((2*M_PI/3)+atan2(P, Y)));

    //stage 2
    L1 = labs((sqrt((L1 * sqrt(4 * pow(LENGTH_NEUTRAL, 2)+ pow(L1, 2)))/(pow(WIRE_RADIUS, 2)) - (pow(L1, 2))/(pow(WIRE_RADIUS, 2)))/sqrt(2)) / ENCODER_RES);

    L2 = labs((sqrt((L2 * sqrt(4 * pow(LENGTH_NEUTRAL, 2)+ pow(L2, 2)))/(pow(WIRE_RADIUS, 2)) - (pow(L2, 2))/(pow(WIRE_RADIUS, 2)))/sqrt(2)) / ENCODER_RES);

    L3 = labs((sqrt((L3 * sqrt(4 * pow(LENGTH_NEUTRAL, 2)+ pow(L3, 2)))/(pow(WIRE_RADIUS, 2)) - (pow(L3, 2))/(pow(WIRE_RADIUS, 2)))/sqrt(2)) / ENCODER_RES);

    //output
    //temp output for debugging
    cout << "-------\nResults:\n";
    cout << "L1: " << L1 << "\n";
    cout << "L2: " << L2 << "\n";
    cout << "L3: " << L3 << "\n";
}

これまでに試したことの網羅的なリストは次のとおりです。

  • level1 を静的クラスから通常のクラスに変更します (そのため、動作させるにはオブジェクトを作成する必要があります)
  • デスクトップを検索パスに含める
  • 最初に level1 をオブジェクトにコンパイルし、次にそれをメイン プログラムでコンパイルします。
  • Code::Blocks でヘッダー ファイルのリンカ AND/OR コンパイルを有効にする
  • level1.cpp に level1.h #include ヘッダーを配置する

まだいくつかあるかもしれませんが、遅くて記憶が曖昧です... よろしくお願いします。

4

1 に答える 1

4

あなたの問題はそれです

void segout(int Seg, double P, double Y)

と同じではありません

void level1::segout(int Seg, double P, double Y)

したがって、ある関数を宣言し、別の関数を定義しています。そのため、リンカーは関数の定義を見つけることができません。メンバー関数を使用する場合、それらが静的であるか非静的であるかに関係なく、クラス内でそれらのスコープを設定する必要があります。

また、ブラケット <include> はシステム ライブラリ用です。それ以外の場合は、引用符で囲まれた「includes」を使用する必要があります。

于 2012-05-19T02:55:34.070 に答える