Makefile (LINUX)

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Monopo
Сообщения: 125
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

LINUX

Код: Выделить всё

// hello.cpp
#include <iostream.h>

using namespace std;

void hello_(void)
{
    cout<<"HELLO WORLD!!"<<endl;
}

Код: Выделить всё

// main.cpp
#include "hello.h"

int main()
{
    hello_();
    return 0;
}
Выполняю:

touch Makefile

Код: Выделить всё

// Makefile
    hello: main.o hello.o                      // (*)
        g++ -o hello main.o hello.o 

    main.o: main.cpp
        g++ -c main.cpp

    hello.o: hello.cpp
        g++ -c hello.cpp

    clean:
        rm -f *.o hello
Выполняю:

make

Все компилируется, появляются два объектных файла hello.o и main.o. Возникает ошибка при выполнении (*), что-то вроде мультиопределения hello_().
Юный Падаван
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А текст hello.h приведёшь?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Monopo
Сообщения: 125
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

Код: Выделить всё

// hello.h
void hello_(void);
:D
Юный Падаван
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Возможно, проблемы компилятора. Я использую vacpp. Ещё одно отличие - у меня не Linux, а AIX5.3. Тем не менее поводение должно быть одинаковым с разными компиляторами и с разными юниксоидами. Мой vacpp успешно компилирует файлы и линкует их. При запуски hello видна строка "HELLO WORLD!!".
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Monopo
Сообщения: 125
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

Вот proc.cpp:

Код: Выделить всё

#include "iostream"
#include "string.h"
#include "list"

using namespace std;

list<float> PList; 
list<float>::iterator x = PList.begin();
list<float> WList;
list<float>::iterator p = WList.begin();
sort.cpp:

Код: Выделить всё

void Sort(float& numbch,float& numbzn)
{
        float dis=0,tempdis=0;
        x = PList.begin();
        dis=(*x)-numbch/numbzn;
        if(dis<0)
                dis*=(-1);
        while (x!=PList.end())
	{
                tempdis=((*x)*numbzn-numbch)/numbzn;
                if(tempdis<0)
                        tempdis*=(-1);
                if(tempdis<dis)
                        dis=tempdis;
                cout<<tempdis<<endl;
		++x;
	}
        int k=0;
        x = PList.begin();
        cout<<"The distance from = "<<dis<<endl;
        while (x!=PList.end())
	{
                tempdis=(*x)-numbch/numbzn;
                if(tempdis<0)
                        tempdis*=(-1);
                if(tempdis==dis)
                        cout<<" X("<<k<<") = "<<(*x)<<endl;
		++x;
                k++;
	}
}
cent.cpp:

Код: Выделить всё

#include "sort.h"

void Center(void)
{
        x = PList.begin();
        p = WList.begin();
        float ch=0,zn=0;
        while (x!=PList.end())
	{
		ch+=(*x)*(*p);
                zn+=(*p);
		++x;
                ++p;
	}
        Sort(ch,zn);
}
list.cpp (содержит главную функцию):

Код: Выделить всё

#include "iostream"
#include "cent.h"

int main()
{
        int n=0;
        cout<<"Enter the N = ";
        cin>>n;
        cout<<"Enter the LIST (coordinate of the line / weight of the point):"<<endl;
        float Px,Wp;
        for(int k=0;k<n;k++)
        {
                cout<<" X("<<k<<") = ";
                cin>>Px;
                cout<<"   P("<<k<<") = ";
                cin>>Wp;
                cout<<endl;
	        PList.insert(x, Px);
	        WList.insert(p, Wp);
        }
        Center();
	return 0;
}

Юный Падаван
Аватара пользователя
Monopo
Сообщения: 125
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

proc.h:

Код: Выделить всё

#include "iostream"
#include "string.h"
#include "list"

using namespace std;

list<float> PList; 
list<float>::iterator x = PList.begin();
list<float> WList;
list<float>::iterator p = WList.begin();
sort.h:

Код: Выделить всё

void Sort(float& numbch,float& numbzn);
cent.h:

Код: Выделить всё

void Center(void);
Makefile:

Код: Выделить всё

#Makefile for Lists project

List: proc.o sort.o cent.o list.o
	g++ -o proc.o sort.o cent.o list.o

list.o: list.cpp
	g++ -c list.cpp

cent.o: cent.cpp
	g++ -c cent.cpp

sort.o: sort.cpp
	g++ -c sort.cpp

proc.o: proc.cpp
	g++ -c proc.cpp

clean:
	rm -f *.o List
Возможно, вопрос глуповат, но как правильно подключить *.h в собирании List? У меня в одних случаях получается недоопределение, а в других - мультиопределение..
Юный Падаван
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

proc.h:

Код: Выделить всё

#ifndef _PROC_H_
#define _PROC_H_

#include "iostream"
#include "string.h"
#include "list"

using namespace std;

extern list<float> PList; 
extern list<float>::iterator x;
extern list<float> WList;
extern list<float>::iterator p;

#endif // _PROC_H_
proc.cpp

Код: Выделить всё

#include "proc.h"

list<float> PList; 
list<float>::iterator x = PList.begin();
list<float> WList;
list<float>::iterator p = WList.begin();
Хедер гвард должен присутствовать и в остальных h файлах.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Monopo
Сообщения: 125
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

Все, спасибо огромное, все понял и все пошло.
Юный Падаван
Аватара пользователя
Monopo
Сообщения: 125
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

Скажите, пожалуйста, если я имею TCl.cpp:

Код: Выделить всё

class TClass{
public:
TClass():Str(""){};
TClass(const TClass& obj){Str=obj.Str};
TClass(string& s):Str(s){};
~TClass(){};
//...
protected:
string Str;
};
Как следует прописать определение этого класса в соответствующем TCl.h??
Юный Падаван
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Вот так и прописать.
Собаственно, для этого класса CPP-файл и не нужен, т.к. реализации всех медотов прописаны инлайном в определнии класса.
Ответить