2015-06-26 2 views
0

Я использую общий library.so, чтобы избежать перекомпоновки исполняемых файлов (которые связаны с ним), когда только реализация (library.cpp), но не интерфейс (library.hpp), имеет изменилось, т.е.Как выражать зависимость от общей библиотеки при создании многопоточных

obj/library.o: library.cpp library.hpp 
lib/library.so: obj/library.o 

program  : program.cpp library.hpp 
       $(CXX) program.cpp -Llib -lrary 

Таким образом, program не зависит от library.cpp или library.so. Однако, когда вы делаете это с нуля (вместо того, чтобы переделывать его из-за изменений в некоторых файлах), library.so должен быть сделан до program. Это может быть обеспечено путем установки:

default: library.so program 

Но при использовании make -j это сломано.

Так что правильный способ 1) обеспечить library.so производится до program но 2) избежать повторного создания program если только library.cpp изменилось?

+0

Что многопоточность нужна сделать с этим вопросом? –

+0

@EtanReisner 'make -j' использует несколько потоков: он может начать делать' program' в одном потоке, прежде чем заканчивать создание 'library' на других. – Walter

+0

На самом деле он запускает несколько процессов, а не потоков, но это также не имеет отношения к точке. Ваш make-файл, как написано, нарушается при запуске 'make program' в чистом каталоге, не имеющем ничего общего с' make -j' или несколькими процессами/etc. –

ответ

1

Решение, для которого вы хотите, является предварительным условием для заказа.

Из Types of Prerequisites раздела Руководства по GNU Make:

Иногда, однако, у вас есть ситуации, в которой вы хотите ввести конкретный порядок по правилам, которые будут вызываться без заставляя цель быть обновляется, если выполняется одно из этих правил. В этом случае вы хотите определить только заказы. Предварительные требования только для заказа могут быть указаны путем помещения символа трубы (|) в список предварительных условий: любые предпосылки слева от символа трубы являются нормальными; любые предпосылки прав являются порядка только:

targets : normal-prerequisites | order-only-prerequisites 
+0

это выглядит точно, что я хочу ... попробует в ближайшее время. – Walter

Смежные вопросы