Viết Makefile biên dịch chương trình với g++ bị lỗi

Chào mọi người, mình đang viết chương trình về mảng, lúc đầu viết chương trình ở chung file mã nguồn thì chạy được, nhưng sau đó tách chương trình ra thành các file như sau: main.cpp, array.cpp và array.h và làm Makefile nhưng khi chạy Makefile nó báo lỗi như sau:

Để chạy được chương trình thì mình cần chương các file obj của các file .cpp, sau đó link các file .o lại với nhau nhưng không hiểu sao lỗi báo là không hiểu các hàm mình đã viết trong chương trình và trong Makefile mình đã thực hiện như sau:

CXX = g++
CXXFLAGS = -Wall -g
main: main.o array.o
	$(CXX) $(CXXFLAGS) -o main main.o array.o

# The main.o target can be written more simply
main.o: main.cpp array.h array.cpp
	$(CXX) $(CXXFLAGS) -c main.cpp

array.o: array.h array.cpp
	$(CXX) $(CXXFLAGS) -c array.cpp

main.cpp

#include <iostream>
#include "array.h"

using namespace std;

int main()
{
	int array [6] = {1, 5, 6, 2, 4, 8};
	char ArrayCore [] = "ArrayCore";
	char *ArrayC  = ArrayCore;

	int array_copy [6] = {0};
	char ArrayCopy [] = "ArrayCopy";
	char *ArrayCy = ArrayCopy;

	int sum = 0;
	double average_value = 0;

	int giatriMax = 0;

	// Hien thi array
	hienthi(array, 6, ArrayCore);
	cout << "================================" << endl;
	hienthi(array_copy, 6, ArrayCopy);


	// Tong cac phan tu trong array
	sum = sum_array(array, 6);
	cout << "Tong cac gia tri trong array = " << sum << endl;

	// average value in array
	average_value = average_array (array, 6);
	cout << "Trung binh cong cac phan tu trong array = " << average_value << endl;

	// Copy du lieu mang array vao mang array_copy
	copy_array (array, array_copy, 6);

	cout << "Moi ban nhap vao gia tri Max: ";
	cin >> giatriMax;
	maximun_array (array, 6, giatriMax);
	return 0;
}

array.cpp

#include <iostream>
#include "array.h"

using namespace std;

void hienthi (int array1 [], int size_array, char *name)
{
	int i = 0;
	for (i = 0; i < size_array; i++)
	{
		cout << "Value " << name << "[" << i << "] = ";
		cout << array1[i] << endl;
	}
}

int sum_array (int array2 [], int size_array)
{
	int sum = 0, i = 0;
	for (i = 0; i < size_array; i++)
	{
		sum = sum + array2[i];
	}

	return sum;
}

double average_array (int array3 [], int size_array)
{
	double sum = 0;
	for (int i = 0; i < size_array; i++)
	{
		sum = sum + array3 [i];
	}

	return (double(sum/size_array));
}

void copy_array (int array4 [], int array5 [], int size_array)
{
	for(int i =0; i < size_array; i++)
	{
		array5 [i] = array4 [i];
		cout << "After copy, array_copy [" << i << "] " << "have value: " << array5[i] << endl;
	}

}

void maximun_array (int array6 [], int size_array,  int valueMax)
{
	for (int i = 0; i < size_array; i++)
	{
		if(array6[i] > valueMax)
		{
			array6[i] = 0;
		}

		cout << "After compare, array [" << i << "] " << array6[i] << endl;
	}
}

array.h

#ifndef _ARRAY_H
#define _ARRAY_H

void hienthi (int array1 [], int size_array, char *name);

//Tạo một function tongArray để tính tổng các giá trị chứa trong nó (sử dụng return để trả về giá trị).
int sum_array (int array2 [], int size_array);

// Tạo một function trungBinhArray để tính trung bình các giá trị chứa trong nó.
double average_array (int array3 [], int size_array);

// Tạo một function copyArray để chép nội dung array này sang một array khác.
void copy_array (int array4 [], int array5 [], int size_array);

/* Viết một function maximumArray có nhiệm vụ so sánh tất cả các giá trị chứa bên trong array với
giaTriMax. Nếu có giá trị lớn hơn biến số giaTriMax đưa vào, nó sẽ chuyển thành 0 */
void maximun_array (int array6 [], int size_array,  int valueMax);

// Hãy viết một function sapXepArray sắp xếp lại các giá trị bên trong theo thứ tự tăng dần.
void arrange_incremental_array (int array7 [], int size_array);

#endif

Tìm mãi mà mình không biết mình đã thiếu sót ở đâu.
Hiện mình đang làm trên máy Ubuntu và dùng g++. Mong mọi người giúp đở :slight_smile: .

Với dòng:

main.o: main.cpp array.h array.cpp
	$(CXX) $(CXXFLAGS) -c main.cpp

Trong Makefile thì mình đã có được file main.o. Và mình cũng làm tương tự như thế với array.cpp:

array.o: array.h array.cpp
	$(CXX) $(CXXFLAGS) -c array.cpp

Nhưng không hiểu sao nó không cho ra được file .o.

xxxxxxx-PC:~/test$ make
g++ -Wall -g -c main.cpp
main.cpp: In function ‘int main()’:
main.cpp:10:11: warning: unused variable ‘ArrayC’ [-Wunused-variable]
     char *ArrayC  = ArrayCore;
           ^
main.cpp:14:11: warning: unused variable ‘ArrayCy’ [-Wunused-variable]
     char *ArrayCy = ArrayCopy;
           ^
g++ -Wall -g -c array.cpp
g++ -Wall -g -o main main.o array.o

Mình build bình thường mà @_@!

3 Likes

[Đã fix được]

Bằng cách chỉnh lại Makefile như sau:

# Makefile for Writing Make Files Example

# *****************************************************
# Variables to control Makefile operation

CXX = g++
CXXFLAGS = -Wall -g

# ****************************************************
# Targets needed to bring the executable up to date

main: main.o array.o
	$(CXX) $(CXXFLAGS) -o main_array main.o array.o

# The main.o target can be written more simply

main.o: main.cpp array.h
	$(CXX) $(CXXFLAGS) -c main.cpp

array.o: array.h

clean:
	rm *o main_array

Cảm ơn mọi người đã giúp đở :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?