@famousman204

Как в gcc сохранять объектные файлы(в другой папке)?

Не знаю как объектные файлы в отдельной папке... в интернете поискал, нашёл только способы вызова Сатаны из компилятора, а как файлы нет... если что, то Makefile такой:
NAME = calc

SRC = main.c \
	parser.c \
	ft_lib/ft_atoi.c \
	ft_lib/ft_putchar.c \
	ft_lib/ft_putnbr.c

OBJ = *.o

FLAGS = #-Wall -Wextra -Werror

all: $(NAME)

$(NAME):
	gcc $(SRC) $(FLAGS) -c
	gcc $(OBJ) -o $(NAME)

clean:
	rm -f $(OBJ)

fclean:
	rm -f $(NAME)

re: fclean all
  • Вопрос задан
  • 1738 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как в gcc сохранять объектные файлы

Опция -o -- путь к результату, препроцессирования/компиляции/линковки. Научи свой Makefile подставлять правильный путь в эту опцию.
Ты скажешь "а у меня 100500 исходных файлов компилируется разом". Ответ -- а не надо так делать. Компилятор всё равно вызывается каждый раз новый. Напиши правило компилирующее один файл в нужный каталог -- и выполни его по разу для каждого исходника. Например так:
NAME = calc

SRC = main.c \
  parser.c \
  ft_lib/ft_atoi.c \
  ft_lib/ft_putchar.c \
  ft_lib/ft_putnbr.c

BUILDDIR=build
OBJ = $(addprefix $(BUILDDIR)/,$(subst /,_,$(patsubst %.c,%.o,$(SRC))))

FLAGS = #-Wall -Wextra -Werror

all: $(NAME)

$(NAME): $(OBJ)
  gcc $(OBJ) -o $(NAME)

define CC_RULE =
$(BUILDDIR)/$(subst /,_,$(patsubst %c,%o,$(SOURCE))): $(SOURCE)
  gcc $(FLAGS) -c $< -o $@
endef

$(foreach SOURCE,$(SRC),$(eval $(call CC_RULE,$(SOURCE))))

clean:
  rm -f $(OBJ)

fclean:
  rm -f $(NAME)

re: fclean all


Смотри: я сделал список объектников из $(SRC), написал генератор CC_RULE, который для любого исходника генерирует правило компиляции его в объектник под $(BUILDDIR) и вызвал его для всех исходников в $(SRC).

Это забавное развлечение, но гораздо практичнее воспользоваться существующей системой сборки: autotools/CMake/...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы