реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Помогите разобраться в работе make
Harvester
сообщение May 18 2018, 15:38
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Имеется проект из одного файла, для сборки которого используется 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


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
yes
сообщение May 18 2018, 16:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



не будучи экспертом - из общей эрудиции
1) в makefile правило для *.c файла, а компилится cpp - то есть вызывается дефолтное cpp правило, которое описывать не нужно
2) там уже линкер, не увидел CFLAG вообще

3) - чтобы избавится от зависимомти от версий so.2.0.0 - в директорию lib кладется линк, при смене версии меняется только линк, а программы, которые использовали эту библиотеку продолжают работать. то есть всегда lib/libmarsh.so а какая там версия - для них не важно (скрыто в линке установщиком/сборщиком)
Go to the top of the page
 
+Quote Post
R6L-025
сообщение May 18 2018, 19:28
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 8-04-11
Из: Ростов-на-Дону
Пользователь №: 64 227



К первому вопросу - не уверен, но может быть из-за того что ссылка на компилятор указана как CC = g++, и автоматом подтягивается флаг для C++?

По крайне мере если судить по второму листингу, компилятор подцепил именно флаг, а не дефолтное значение
Go to the top of the page
 
+Quote Post
Эдди
сообщение May 19 2018, 05:31
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Неправильный какой-то makefile: где цель install? Вручную что ли все это хозяйство копировать предлагается в /usr/lib? Тогда нет смысла делать симлинки, т.к. их и вручную можно сделать.
Go to the top of the page
 
+Quote Post
Harvester
сообщение May 19 2018, 09:34
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(Эдди @ May 19 2018, 08:31) *
Неправильный какой-то makefile: где цель install? Вручную что ли все это хозяйство копировать предлагается в /usr/lib?

Какой есть. laughing.gif
Эта библиотека используется в локальном проекте, расположенном в соседней папке. Наверное поэтому разработчик и не стал заморачиваться.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
Эдди
сообщение May 19 2018, 12:50
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Тогда симлинки тоже не нужны, достаточно библиотеку туда копировать.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение May 26 2018, 22:55
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



1. CXXFLAGS это макрос. Как хотите так и называйте. Типа объявления макроса в С при помощи #define
Можно объявить и использовать когда-нибудь в будущем.

2. Допустим один написал библиотеку версии 2.0.0 libmarsh.so.2.0.0, кто-то другой ее использовал. Потом первый добавил функциональности и написал libmarsh.so.2.1.0.
Кто-то третий, компилируя прогрмму второго, всегда будет линковать ее с библиотекой libmarsh.so.2.0.0 и никогда libmarsh.so.2.1.0, пока не поменяет в мейк файле с чем линковать. Неудобно.
Чтобы избежать этого всегда линкуют с libmarsh.so, которая есть soft link на текущую версию библиотеки. В мейк файле всегда libmarsh.so.
Go to the top of the page
 
+Quote Post
Olej
сообщение Jul 1 2018, 10:34
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(Harvester @ May 18 2018, 18:38) *
У меня, собственно 2 вопроса:
1. Почему в 1-й команде используется CXXFLAGS, хотя он не указан в правиле, а CFLAGS не используется, хотя и указан. При этом в 3-й команде CXXFLAGS уже не используется, хотя точно также не указан в правиле
2. (Этот вопрос относится, скорее, к идеологии разработки ПО под Линукс)
Зачем нужно создавать символические ссылки, если результатом сборки должна быть библиотека ../lib/libmarsh.a?

У make существует огромное число внутренних (дефаултных) правил, переменных, суффиксов и т.д.
Вы их можете все посмотреть так:
Код
$ make -p > make.suffix
...

(я потому и советую переадресовать в файл, а потом изучить, что их число огромное)

Здесь вам перевод (не самый свежий, но достаточно ... для беглого чтения, там объём большой):
GNU Make. Программа управления компиляцией. GNU make Версия 3.79. Апрель 2000, авторы: Richard M. Stallman и Roland McGrath, перевод: Владимир Игнатов, 2000.

Подробнее про идеологию технику сборки под Linux можете почитать здесь: Разработка программных проектов в Linux.


Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th April 2024 - 04:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01452 секунд с 7
ELECTRONIX ©2004-2016