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

4

Я работал над проектом 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.

Привет, DrYap. Я хочу собрать PROG и определить, нужно ли перестраивать liba.so. airekans
Вы сказали, что есть файл зависимостей, так чтоprog.cpp зависит отa.h, Таким образом, PROG будет перестроен, если интерфейс изменится. Но почемуPROG зависит отliba.so ? Я бы ожидалall зависеть отliba.so вместо. William Morris
Привет Моррис. Как вы сказали,all может зависеть отPROG а такжеliba.so в то же время. Но вы должны указать порядок застройки между ними, чтобыliba.so будет построен перед строительствомPROG, И это мой вопрос. airekans
Заmake -j1, который является вариантом по умолчанию, это будет работать. Но если вы запустите егоmake -j2Это вызовет проблемы. Еслиliba.soвремя строительства больше, чемPROG's, не гарантируется, чтоPROG использовать новыйliba.so, Проблема вPROG явно не зависит отliba.so. airekans
Если вы хотите просто собрать библиотеку, вы можете использоватьmake liba.so DrYap

Ваш Ответ

1   ответ
3

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

Спасибо приятель Это то, что я хочу. airekans

Похожие вопросы