Как указать целевой порядок сборки Makefile без каких-либо физических зависимостей?

Я работал над проектом C ++, который ссылается на файл .so (динамическая библиотека). Предположим, у меня есть целевой PROG, который должен соединиться с a.so, и a.so также создан мной, как указано в следующем Makefile.

<code>PROG_SRCS = prog.cpp
PROG_OBJS = $(PROG_SRCS: %.cpp:%.o)

all: PROG
PROG: $(PROG_OBJS) liba.so
    $(LINK.cpp) -o [email protected] $(PROG_OBJS) -la

LIBA_SRCS = liba/a.cpp
LIBA_OBJS = $(LIBA_SRCS: %.cpp:%.o)

liba.so: $(LIBA_OBJS)
    $(LINK.cpp) -shared -Wl.-soname,[email protected] -o [email protected] $^
</code>

Я использовал авто-генерацию зависимостей, чтобы получить .cpp файлы получить свою собственную зависимость от .h файлы. И prog.cpp включает в себя

Но таким образом, как только я изменю a.cpp, liba.so будет переделан, тогда PROG будет римейк (relink), чего я не хочу. Я просто изменил реализацию liba.so, но не любые определения интерфейса. ПРОГ должен просто переделать после того как я поменяю а.х.

Я хочу сделать так, чтобы a.so собирался до сборки PROG, но изменения a.so не повлекут за собой создание PROG.

Следующий Makefile - метод, который я понял, но с небольшим побочным эффектом (создать временный файл).

<code>ORDER = /tmp/.ORDER

all: PROG
PROG: $(PROG_OBJS) $(ORDER)
    $(LINK.cpp) -shared -Wl,-soname,[email protected] -o [email protected] $(PROG_OBJS) -la

$(ORDER): liba.so
    test -e [email protected] || touch [email protected]
</code>

Таким образом, каждый раз, когда liba.so получает римейк, $ (ORDER) тоже получает римейк. Но это только касание файл, если он не существует.

Есть ли способ указать этот вид зависимости без каких-либо побочных эффектов, например, Создание файла TMP.

 airekans06 мая 2012 г., 15:00
Привет Моррис. Как вы сказали,all может зависеть отPROG а такжеliba.so в то же время. Но вы должны указать порядок застройки между ними, чтобыliba.so будет построен перед строительствомPROG, И это мой вопрос.
 DrYap05 мая 2012 г., 08:26
Если вы хотите просто собрать библиотеку, вы можете использоватьmake liba.so
 airekans08 мая 2012 г., 02:55
Заmake -j1, который является вариантом по умолчанию, это будет работать. Но если вы запустите егоmake -j2Это вызовет проблемы. Еслиliba.soвремя строительства больше, чемPROG's, не гарантируется, чтоPROG использовать новыйliba.so, Проблема вPROG явно не зависит отliba.so.
 airekans05 мая 2012 г., 08:46
Привет, DrYap. Я хочу собрать PROG и определить, нужно ли перестраивать liba.so.
 William Morris06 мая 2012 г., 04:24
Вы сказали, что есть файл зависимостей, так чтоprog.cpp зависит отa.h, Таким образом, PROG будет перестроен, если интерфейс изменится. Но почемуPROG зависит отliba.so ? Я бы ожидалall зависеть отliba.so вместо.

Ответы на вопрос(1)

Решение Вопроса

вы можете использовать предварительные условия только для заказапредварительные условия только для заказа за это. Это единственный способ сделать это, кроме метода файла штампа, который вы уже обнаружили.

 airekans05 мая 2012 г., 09:21
Спасибо приятель Это то, что я хочу.

Ваш ответ на вопрос