Имеется проект из одного файла, для сборки которого используется makefile:
CODE
Код
CFLAGS ?= -O2
LIBNAME = libmarsh
VERSION_MAJOR = 2
VERSION_MINOR = 0
VERSION_RELEASE = 0
LINKER_NAME = ${LIBNAME}.so
SONAME = ${LINKER_NAME}.${VERSION_MAJOR}
REALNAME = ${SONAME}.${VERSION_MINOR}.${VERSION_RELEASE}
TARGET_DIR = ../lib
TARGET = ${TARGET_DIR}/${REALNAME}
TARGET_STATIC = ${TARGET_DIR}/${LIBNAME}.a
SRC = ${wildcard *.cpp}
OBJECTS = ${SRC:.cpp=.o}
HEADERS = ${wildcard ../include/*.h *.h}
CFLAGS += -Wall -fPIC -I../include -I../../
LDFLAGS = -L/usr/lib/
LIBSERIAL_STATIC = -static -L/usr/lib/ -I/usr/include/ ../../libserial-0.6.0rc1/src/.libs/libserial.a
LDFLAGS += -lrt
CXXFLAGS += -g -std=c++0x -fpermissive
CC = g++
all: ${TARGET} ${TARGET_STATIC} Makefile
${TARGET}: ${OBJECTS} Makefile
mkdir -p ${TARGET_DIR}
${OBJECTS}
${CC} ${LDFLAGS} ${OBJECTS} ${LIBSERIAL_STATIC} -Wl,-soname,${SONAME} -o ${TARGET} ${LDFLAGS}
ln -sf ${REALNAME} ${TARGET_DIR}/${SONAME}
ln -sf ${REALNAME} ${TARGET_DIR}/${LINKER_NAME}
${TARGET_STATIC}: ${OBJECTS} Makefile
ar cr $@ ${OBJECTS}
%.o: %.c ${HEADERS} Makefile
${CC} -c ${CFLAGS} $< -o $@
clean:
rm -rf ${OBJECTS} ${TARGET} ${TARGET_STATIC} ${TARGET_DIR}/${SONAME} ${TARGET_DIR}/${LINKER_NAME}
.PHONY: all clean
При сборке выполняются следующие команды:
Код
g++ -g -std=c++0x -fpermissive -c -o libmarsh.o libmarsh.cpp
mkdir -p ../lib
g++ -L/usr/lib/ -lrt libmarsh.o -static -L/usr/lib/ -I/usr/include/ ../../libserial-0.6.0rc1/src/.libs/libserial.a -Wl,-soname,libmarsh.so.2 -o ../lib/libmarsh.so.2.0.0 -L/usr/lib/ -lrt
ln -sf libmarsh.so.2.0.0 ../lib/libmarsh.so.2
ln -sf libmarsh.so.2.0.0 ../lib/libmarsh.so
ar cr ../lib/libmarsh.a libmarsh.o
У меня, собственно 2 вопроса:
1. Почему в 1-й команде используется CXXFLAGS, хотя он не указан в правиле, а CFLAGS не используется, хотя и указан. При этом в 3-й команде CXXFLAGS уже не используется, хотя точно также не указан в правиле
2. (Этот вопрос относится, скорее, к идеологии разработки ПО под Линукс)
Зачем нужно создавать символические ссылки, если результатом сборки должна быть библиотека ../lib/libmarsh.a?
Сообщение отредактировал Harvester - May 18 2018, 15:40