Makefile не помещает .o файлы в папку сборки - PullRequest
0 голосов
/ 18 марта 2019

Задача

У меня есть следующая структура каталогов и файлов:

Makefile
main.cpp
|source
|-A.cpp
|-B.cpp
|-Linker.h
|build

И каждый файл имеет такую ​​структуру

main.cpp

//main.cpp
#include "source/Linker.h"

int main(){
    A(...)
    B(...)
}

Linker.h

//Linker.h
void A
void B

a.cpp B.cpp каждый определяет определенную функцию.

Мне нравится строить эту структуру, используя Makefile и , помещая все файлы .o в каталог build .


Что я пробовал

Итак, я сделал следующее Makefile:

CC = g++ -std=c++11
CFLAGS = -c -Wall

OBJS = ./build/main.o ./build/A.o ./build/B.o 
OUT  = Project

all: Project

Project: $(OBJS)
    $(CC) $(OBJS) -o Project

./build/main.o: main.cpp
    $(CC) $(CFLAGS) main.cpp

./build/A.o: ./source/A.cpp
    $(CC) $(CFLAGS) ./source/A.cpp

./build/B.o: ./source/B.cpp
    $(CC) $(CFLAGS) ./source/B.cpp

Error

Но при этом создаются все файлы .o в верхнем каталоге со следующей ошибкой:

g++: error: ./build/main.o: No such file or directory
g++: error: ./build/A.o: No such file or directory
g++: error: ./build/B.o: No such file or directory

Как мне поступить?

1 Ответ

6 голосов
/ 18 марта 2019

Компилятор сообщает, что выходной каталог с этими .o файлами не существует.

Исправление состоит в том, чтобы заставить цели зависеть от их каталога и явно указать выходные файлы (с -o $@):

Project: $(OBJS)
    $(CC) -o $@ $(OBJS) 

build/%.o: %.cpp | build
    $(CC) -o $@ $(CFLAGS) $<

build/%.o: source/%.cpp | build
    $(CC) -o $@ $(CFLAGS) $<

build:
    mkdir $@

Обратите внимание, что для построения всех ваших файлов .o вышеизложенное использует одно правило шаблона.


Обычно CXX используется для компилятора C ++ вместе с CXXFLAGS. CC и CFLAGS используются для построения кода C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...