0

メイクファイルを書きたいのですが初心者です。私が書いたものをインクルードするメインファイルがあります。l_mpc.h helper.hまた、gnuplot を使用しているため、gnuplot_i.hpp が必要です。

これは私のメイクファイルです

CPPFLAGS=-I /usr/local/include/eigen3

dc_motor_main.out : dc_motor_main.o 
    g++ -o main.out dc_motor_main.o

dc_motor_main.o: l_mpc.o helper.o 
    g++ $(CPPFLAGS) -c dc_motor_main.cpp l_mpc.o helper.o 

gnuplot_i.o: gnuplot_i.hpp
    g++ $(CPPFLAGS) -c gnuplot_i.hpp 

l_mpc.o: l_mpc.cpp l_mpc.h
    g++ $(CPPFLAGS) -c l_mpc.cpp

helper.o: helper.cpp helper.h
    g++ $(CPPFLAGS) -c helper.cpp

clean:
    rm *.o dc_motor_main.out

出力は次のとおりです。

g++ -I /usr/local/include/eigen3 -c l_mpc.cpp
g++ -I /usr/local/include/eigen3 -c helper.cpp
g++ -I /usr/local/include/eigen3 -c dc_motor_main.cpp l_mpc.o helper.o 
g++: warning: l_mpc.o: linker input file unused because linking not done
g++: warning: helper.o: linker input file unused because linking not done
g++ -o main.out dc_motor_main.o
dc_motor_main.o: In function `main':
dc_motor_main.cpp:(.text+0x3ab3): undefined reference to `SysMat::SysMat()'
dc_motor_main.cpp:(.text+0x40fa): undefined reference to `SysMat::calcMPCFi(int)'

これSysMat::SysMat()は l_mpc.h にあります。どこで間違えますか?

これは私のヘッダーファイルです: main.cpp

#include <iostream>
#include <Eigen/Dense>
#include <sys/time.h>

#include "gnuplot_i.hpp"
#include "l_mpc.h"
#include "helper.h"

#define DEBUG 1

int main( int argc, char* argv[])
{   ....

helper.h

#include <iostream>
#include <Eigen/Dense>
#include <sys/time.h>
#include "gnuplot_i.hpp"

using namespace Eigen;

double now();
void plot_x(MatrixXd, Gnuplot *);
void plot_x(MatrixXd, float, Gnuplot *);
void plot_xy(MatrixXd, MatrixXd,  Gnuplot *);
void plot_xy(MatrixXd, Gnuplot *);

template <typename T> int sgn(T val) {
    return (T(0) < val) - (val < T(0));
}

l_mpc.h

#include <iostream>
#include <Eigen/Dense>
#include <sys/time.h>
#include "gnuplot_i.hpp"


using namespace Eigen;

class SysMat
{
    public:
        MatrixXd Fi;
        MatrixXd Ga;
        MatrixXd C;
        MatrixXd Er;
    private:    
        MatrixXd MPCFi;
        MatrixXd MPCGa;
        MatrixXd MPCGy;     
    public:
        SysMat(MatrixXd, MatrixXd, MatrixXd);
        SysMat();
        ~SysMat();
        void calcMPCFi(int);
        void calcMPCGa(int);
        void calcMPCGy(int, int);
        MatrixXd calcContSig(MatrixXd, MatrixXd, MatrixXd);
        MatrixXd calcError(MatrixXd, MatrixXd, MatrixXd);
};
4

2 に答える 2

3

間違いはここにあるようです

dc_motor_main.out : dc_motor_main.o 
    g++ -o main.out dc_motor_main.o

dc_motor_main.o: l_mpc.o helper.o 
    g++ $(CPPFLAGS) -c dc_motor_main.cpp l_mpc.o helper.o 

する必要があります

main.out : dc_motor_main.o l_mpc.o helper.o 
    g++ -o main.out dc_motor_main.o l_mpc.o helper.o

dc_motor_main.o: l_mpc.o helper.o 
    g++ $(CPPFLAGS) -c dc_motor_main.cpp

実行可能ファイルをmain.out.

g++-cオプションを使用すると、コンパイルのみが行われます。なしの最後のステップ-cはリンクと呼ばれ、各 *.cpp ファイルをコンパイルして作成したすべての *.o ファイルを一緒にリンクする必要があります。

オラフが彼の答えで言っているように、これを繰り返さないようにするさまざまな方法がありますが、上記は基本的な手順です。

于 2012-11-19T16:56:09.100 に答える
1

Make は、適切なソースからオブジェクト ファイルを構築する方法を既に知っています。したがって、ほとんどの場合、依存関係を定義するだけでよく、Makefile を次のように単純化できます。

CPPFLAGS=-I /usr/local/include/eigen3
LDFLAGS = # insert linker flags, if needed
LDLIBS = # insert needed libraries here

OBJS = \
dc_motor_main.o  \
gnuplot_i.o \
l_mpc.o \
helper.o \

dc_motor_main.out: $(OBJS)
    g++ $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

gnuplot_i.o: gnuplot_i.hpp

l_mpc.o: l_mpc.h

helper.o: helper.h

clean:
    rm $(OBJS) dc_motor_main.out

コマンドの先頭にタブ文字を付ける必要があることに注意してください。代わりにスペースを挿入しないでください。

于 2012-11-19T16:53:10.760 に答える