Я изменил проводку gcc/g++ option to place all object files into separate directory для своего сценария. Однако возвращает ошибку при запуске make link
.Makefile при srcdir! = Objdir
Project Tree
|--- bin
| |--- main
|--- obj
| |--- object1.o
| |--- object2.o
| |--- ...
|--- src
| |--- source1.cpp
| |--- source2.cpp
| |--- ...
|--- main.cpp
Makefile
SRCDIR = ./src
OBJDIR = ./obj
BINDIR = ./bin
INCDIR = ./src
CC = g++
EXEC = main
SRC = $(wildcard $(SRCDIR)/*.cpp main.cpp)
OBJ = $(addprefix $(OBJDIR)/,$(notdir $(SRC:.cpp=.o)))
compile: $(OBJ)
$(OBJ): $(SRC)
$(CC) -c $< -o [email protected]
link:
$(CC) -o $(EXEC) $(OBJ)
clean:
find -type f -name "$(EXEC)" -delete
find -type f -name "*.o" -delete
find -type f -name "*~" -delete
Например .:
main.cpp
#include <iostream>
#include "Source.h"
using namespace std;
int main(int argc, char* argv[]) {
Source::hello();
return 0;
}
Source.h
#include "Source.h"
#ifndef SOURCE_H
#define SOURCE_H
#include <iostream>
using namespace std;
class Source {
public:
static void hello();
};
#endif
Source.cpp
#include "Source.h"
void Source::hello() {
cout << "Hello Makefile" << endl;
}
make compile
ок! Создание всех объектов (объект/* о.)
Проблема: make link
Erro:
g++ -o main ./obj/Source.o ./obj/main.o
./obj/main.o: In function `Source::hello()':
Source.cpp:(.text+0x0): multiple definition of `Source::hello()'
Я знаю, проблема
g++ -c src/Source.cpp -o obj/Source.o
g++ -c src/Source.cpp -o obj/main.o.
я не знаю, как решить , Любая идея, что может быть неправильным?
Когда вы связываете, компоновщик должен найти все ссылки. Кажется, что не найти функцию 'Classes :: functions()', которая, вероятно, не является проблемой в вашем make-файле, но в исходном файле, который содержит (или ДОЛЖЕН содержать) 'Classes :: functions()' - очевидно, не видя ваш исходный код, почти невозможно точно сказать, что здесь не так. –
Включил мой код в сообщение –
'Source.h', вероятно, не должен иметь' #include "Source.h" 'в нем ... –