我不断遇到这个常见错误然后编译我的程序。我已经尝试过互联网上的许多建议但到目前为止还没有任何建议。我尝试使用g ++通过CMD和Code :: Blocks编译我的代码,但两者都出现了同样的错误:
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 ++编码已经有一段时间了。
main program.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";
}
这是我迄今为止尝试过的一系列无穷无尽的清单:
可能还有一些,但现在已经很晚了,我的记忆已经开始......非常感谢您的帮助。
答案 0 :(得分:4)
你的问题是那个
void segout(int Seg, double P, double Y)
与
不同void level1::segout(int Seg, double P, double Y)
因此,您要声明一个函数并定义另一个函数。这就是链接器找不到函数定义的原因。使用成员函数时,无论是静态函数还是非静态函数,都需要将它们放在类中。
此外,括号&lt; includes&gt;适用于系统库。其他任何东西都应该使用引用的“包含”。