обои
Скажите, у меня есть такая структура файлов:
|Makefile
|build
|source
|-FunctionLinker.h
|-main.cpp
|-A.cpp
|-B.cpp
|-C.cpp
, где я хотел бы скомпилировать, используя Makefile
и сохранить полученные целевые файлы в папке build
. Содержимое этих файлов выглядит следующим образом:
Makefile
CXX = g++ -std=c++11
CXXFLAGS = -c -Wall
OBJS = build/main.o build/A.o build/B.o build/C.o
all: Project
Project: $(OBJS)
$(CXX) -o $@ $(OBJS)
build/%.o: source/%.cpp
$(CXX) -o $@ $(CXXFLAGS) $<
main.cpp
#include <iostream>
#include <vector>
#include "FunctionLinker.h"
int main(){
Vector ExampleVector = {1,2};
Matrix ExampleMatrix = {{1,2},{3,4}};
A(ExampleVector, ExampleMatrix); // which is void
B(ExampleVector, ExampleMatrix); // which is also void
VectorMatrix Res = C(ExampleVector, ExampleMatrix); // which returns struct
for (int i=0; i<2; i++){
std::cout << Res.Vector[i] << '\t'
}
}
A.cpp ( B.cpp почти аналогично)
#include <iostream>
#include <vector>
typedef std::vector<double> Vector;
typedef std::vector<Vector> Matrix;
void A(Matrix& A, Vector& b){
Some calculations...
}
C.cpp
#include <iostream>
#include <vector>
typedef std::vector<double> Vector;
typedef std::vector<Vector> Matrix;
VectorMatrix C(Matrix& A, Vector& b){
Some calculations...
}
FunctionLinker.h
#ifndef FUNCTIONLINKER.H
#define FUNCTIONLINKER.H
#include <iostream>
#include <vector>
typedef std::vector<double> Vector;
typedef std::vector<Vector> Matrix;
struct VectorMatrix{
Vector Vector;
Matrix Matrix;
}; // I defined a struct here to allow a function to return multiple types
void A(Matrix A, Vector b);
void B(Matrix A, Vector b);
VectorMatrix C(Matrix A, Vector b);
#endif
Проблемы
Так что Makefile
отлично работает, но я сомневаюсь, что это самая эффективная практика. Потому что следующие коды
#include <iostream>
#include <vector>
и
typedef std::vector<double> Vector;
typedef std::vector<Vector> Matrix;
довольно избыточны, поэтому я хотел бы найти более "лаконичный" способ выполнения практики. Любая помощь будет оценена.