我必须创建一个程序来读取Storm.dat文件(包含海洋风暴并生成简短的报告)。我已经制作了必要的文件,但是我在Makefile中遇到了一些问题。
下面是我的代码:
storm.h
#ifndef STORMS_H
#define STORMS_H
class Storm
{
private:
    char where; // A, E, C
    char name[11]; // recall '\0'
    int seq; // sequence num 1...
    int year;
    int max_wind; // knots
    int min_press; // millibars or 10000 //
    char type; // H, S, D
public:
    Storm() ;// default constructor
    void print() const ;
    //5 accessors are code next..
    int get_seq() const;
    int get_year() const;
    int get_max_wind() const;
    int get_min_press() const;
    char get_type() const;
} ;
#endifstorm.cc
#include <iostream>
#include <iomanip> // re. setw, etc...
#include <cstring> // re. strcpy( dest, sorc ); etc... //
#include <cstdlib> // re. atoi
#include "storm.h"
using std::cout;
using std::endl;
using std::setw;
using std::left;
using std::right;
 const char* BASINS[] = { " ", "Atlantic", "Eastern Pacific", "Central Pacific" };
int i_basin( char c )
{
    if( c == 'A' ) return 1;
    if( c == 'E' ) return 2;
    if( c == 'C' ) return 3;
    return 0;
}
const char* TYPES[] = { " ", "Hurricane", "Storm", "Depression" };
int i_type( char c )
{
    if( c == 'H' ) return 1;
    if( c == 'S' ) return 2;
    if( c == 'D' ) return 3;
    return 0;
}
Storm::Storm() // default constructor
: where('N'), seq(0), year(0), max_wind(0), min_press(0), type('N')
{ strcpy( name, "None" ); }
void Storm::print() const
{   
    cout << left << setw(17) << BASINS[i_basin(where)]
         << setw(19) << TYPES[i_type(type)]
         << setw(11) << name
         << right << setw(2) << seq
         << '/' << year
         << setw(8) << max_wind;
    if( min_press )
        cout << setw(6) << min_press;
    cout << endl;
}
//5 accessors are coded here...
int Storm::get_seq() const { return seq; }
int Storm::get_year() const { return year; }
int Storm::get_max_wind() const { return max_wind; }
int Storm::get_min_press() const { return min_press; }
char Storm::get_type() const { return type; }assign3_class_storm.cc
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include "storm.h"
using std::cout;
using std::endl;
using std::flush;
using std::cin;
using std::ios;
const char* HEADER =
    "Storm                               Name         Date     Wind  mbar\n"
    "--------------------------------------------------------------------\n";
const char* FNAME_BIN = "storm.dat";
typedef std::vector< Storm > Storms;
bool loadBinFile( const char* fname, Storms& vStorms ) ;
void showStorms( const Storms& vStorms );
template< typename T, typename Cmp >
void sel_sort( std::vector< T >& data, Cmp myCmp  );
// re. sort by increasing dates & seq...
int cmpByYear( const Storm& a, const Storm& b );
// re. sort by decreasing wind speed.
int cmpByWind( const Storm& a, const Storm& b );
// re. sort by increasing air pressure.
int cmpByPress( const Storm& a, const Storm& b );
int main() 
{
    Storms sList;
    if( loadBinFile( FNAME_BIN, sList ) )
    {
        cout << "Now showing sList loaded from file "
             << FNAME_BIN << endl;
        showStorms( sList );
        sel_sort( sList, cmpByYear);
        cout <<"\nSorted by dates ... \n";
        //showStorms( sList );
        sel_sort( sList, cmpByWind );
        cout <<"\nSorted by decreasing wind speed ... \n";
        //showStorms( sList );
        sel_sort( sList, cmpByPress );
        cout <<"\nSorted by increasing air pressure ... \n";
        //showStorms( sList );
    }
    cout << "Press 'Enter' to continue/exit ... " << flush;
    cin.get();
}
void showStorms( const Storms& vStorms )
{
    cout << "Total storms here is: " << vStorms.size() << endl;
    cout << HEADER;
    size_t i = 0;
    while(  i < vStorms.size()  )
    {
        vStorms[i].print();
        ++i;
        if( i % 20 == 0 )
        {
            cout << endl;
            cout << "Press 'Enter' to continue ... " << flush;
            cin.get();
            if( i != vStorms.size() )
                cout << HEADER;
        }
    }
}
bool loadBinFile( const char* fname, Storms& vStorms )
{
    fstream fs ;
    fs.open( fname, ios::in | ios::binary );
    if( fs )
    {
        Storm tmp;
        while( fs.read( (char*)&tmp, sizeof(Storm) ) )
            vStorms.push_back( tmp );
        fs.close();
        return true;
    }
    cout << "\nThere was a problem opening file "
              << fname << endl;
    return false;
}
template< typename T, typename Cmp >
void sel_sort( std::vector< T >& data, Cmp myCmp  )
{
    int len = data.size();
    int lenMinusOne = len-1;
    for( int j = 0; j <  lenMinusOne; ++ j )
    {
        int index_min = j;
        for( int i = j+1; i < len; ++ i )
            if(  myCmp(data[i], data[index_min] ) < 0 )
                index_min = i;
        // now swap ...
        T tmp = data[j];
        data[j] = data[index_min];
        data[index_min] = tmp;
    }
}
// re. sort by increasing dates & seq...
int cmpByYear( const Storm& a, const Storm& b )
{
    int cmp = a.get_year() - b.get_year();
    if( cmp == 0 )
        return a.get_seq() - b.get_seq();
    return cmp;
}
// re. sort by decreasing wind speed.
int cmpByWind( const Storm& a, const Storm& b )
{
    return b.get_max_wind() - a.get_max_wind();
}
// re. sort by increasing air pressure.
int cmpByPress( const Storm& a, const Storm& b )
{
    return a.get_min_press() - b.get_min_press();
}如果有人能帮我找出我在创建Makefile时遇到的这些错误:
这是我的Makefile
output: assign3_class_storm.o storm.o
    g++ -o assign3_class_storm assign3_class_storm.o
    g++ -o storm storm.o
storm.o: storm.cc storm.h
    g++ -c storm.cc
assign3_class_storm.o: assign3_class_storm.cc storm.h
    g++ -c assign3_class_storm.cc
clean:
    -rm *.o assign3_class_storm storm我所犯的错误:
g++ -c assign3_class_storm.cc
g++ -c storm.cc
g++ -o assign3_class_storm assign3_class_storm.o
assign3_class_storm.o: In function `showStorms(std::vector<Storm, std::allocator<Storm> > const&)':
assign3_class_storm.cc:(.text+0x1a2): undefined reference to `Storm::print() const'
assign3_class_storm.o: In function `loadBinFile(char const*, std::vector<Storm, std::allocator<Storm> >&)':
assign3_class_storm.cc:(.text+0x2db): undefined reference to `Storm::Storm()'
assign3_class_storm.o: In function `cmpByYear(Storm const&, Storm const&)':
assign3_class_storm.cc:(.text+0x3d6): undefined reference to `Storm::get_year() const'
assign3_class_storm.cc:(.text+0x3e4): undefined reference to `Storm::get_year() const'
assign3_class_storm.cc:(.text+0x3fd): undefined reference to `Storm::get_seq() const'
assign3_class_storm.cc:(.text+0x40b): undefined reference to `Storm::get_seq() const'
assign3_class_storm.o: In function `cmpByWind(Storm const&, Storm const&)':
assign3_class_storm.cc:(.text+0x438): undefined reference to `Storm::get_max_wind() const'
assign3_class_storm.cc:(.text+0x446): undefined reference to `Storm::get_max_wind() const'
assign3_class_storm.o: In function `cmpByPress(Storm const&, Storm const&)':
assign3_class_storm.cc:(.text+0x46e): undefined reference to `Storm::get_min_press() const'
assign3_class_storm.cc:(.text+0x47c): undefined reference to `Storm::get_min_press() const'
collect2: error: ld returned 1 exit status
Makefile:12: recipe for target 'output' failed
make: *** [output] Error 1如果有人能帮我解决这个问题,我真的很感激你的帮助。
谢谢
发布于 2015-10-07 03:00:45
生成文件被设置为构建两个可执行文件,即storm和assign3_class_storm。这是没有意义的;您不能构建storm,因为storm.cc中没有main(),而且不能单独从assign3_class_storm.cc构建assign3_class_storm,因为它依赖于在storm.cc中定义的Storm类的函数。
首先,让我们纠正中心问题:
output: assign3_class_storm.o storm.o
    g++ -o storm assign3_class_storm.o storm.o一旦完成了(*),您就可以通过将产品的名称作为规则的名称来改进它(这样Make就会知道,当文件已经存在并且是最新的时,规则就不需要执行了):
storm: assign3_class_storm.o storm.o
    g++ -o storm assign3_class_storm.o storm.o一旦这个规则完美地工作了,您就可以在自动变量中减少这个规则的冗余。
storm: assign3_class_storm.o storm.o
    g++ -o $@ $^然后,如果您愿意,可以使输出更加简洁:
storm: assign3_class_storm.o storm.o
    @echo building $@...
    @g++ -o $@ $^(*)您可能必须更正assign3_class_storm.cc中的一个小遗漏。
https://stackoverflow.com/questions/32981956
复制相似问题