Makefile обновил библиотечную зависимость - PullRequest
2 голосов
/ 08 июля 2010

У меня есть большой make-файл, который собирает несколько библиотек, устанавливает их, а затем продолжает создавать объекты, которые ссылаются на эти установленные библиотеки.Моя проблема в том, что я хочу использовать «-lfoo -lbar» в качестве флагов g ++ для связи с двумя установленными библиотеками, но зависимости запутались.Если я изменю заголовок «42.h», от которого зависит библиотека foo, то, конечно, make перестроит и установит его, но он не , кажется, замечает, что мой объект «marvin» использовал «-lfoo»"и Марвин остается связанным со старой версией ...: (

До сих пор я делал:

$(myObject): $(localSrc) /explicit/path/to/lib/libfoo.a
            $(CXX) $(CPPFLAGS) $(INCFLAGS) -o $@ $^ $(LINKFLAGS) $(LINKLIBS)

Но я нахожусь в точке, где это небольше жизнеспособного варианта. Мне нужно просто добавить библиотеки "-lfoo -lbar" в переменную LINKFLAGS и попросить компоновщика разобраться?

В то же время, я добавил несколько команд, чтобы явно выдутьудалите объектный файл (файлы), о котором идет речь, и затем вызовите make, но это становится глупо. У меня мало времени, но при необходимости я могу опубликовать небольшой пример, возможно, вечером пятницы или субботы.

СледовательноЯ чувствую, что я снова в какой-то плохой версии Windows DLL ад. Есть ли что-то, что я могу сделать, чтобы компоновщик обратил внимание на версию библиотек, против которых был построен объект, и связал его, если эти библиотеки изменятся ??

Обновлено: Так что у меня не было шанса разбить предложения до сих пор.Недостатком того, что я делаю, является использование статических библиотек.Поэтому я не могу использовать ldd.Поэтому я переписал свой Makefile и нашел способ обойти эту проблему.Если у меня будет время, я опубликую то, что сделал.

Ответы [ 3 ]

7 голосов
/ 08 июля 2010

Как насчет этого:

LIBS = foo bar blah # and so on

LINKFLAGS = $(addprefix -l,$(LIBS))

LIBPATHS = $(patsubst %,/explicit/path/to/lib/lib%.so, $(LIBS))

$(myObject): $(localSrc) $(LIBPATHS)
        $(CXX) $(CPPFLAGS) $(INCFLAGS) -o $@ $^ $(LINKFLAGS) $(LINKLIBS)
2 голосов
/ 08 июля 2010

Насколько я знаю, make вообще не очень хорош в автоматическом обнаружении таких зависимостей. (На самом деле это не работа make; make - это инструмент более высокого уровня, который не знает о специфике команд, которые он порождает, или о том, что эти команды делают.)

На ум приходят два варианта.

Во-первых, вы можете запустить ldd для $ (myObject), сохранить его список библиотек в текстовом файле, а затем передать его обратно в ваш make-файл в виде списка зависимостей. (Это похоже на использование -MD для сохранения списка файлов заголовков в текстовый файл с последующей передачей его обратно в make-файл в качестве дополнительных правил для компиляции исходного файла, как предложил Сэм Миллер.)

Во-вторых, вы можете использовать переменную LINKLIBS, как вы использовали, и использовать функции GNU Make , чтобы позволить одной и той же переменной работать как для зависимостей, так и для параметров командной строки. Например:

LINKLIBS := /explicit/path/to/lib/libfoo.so
$(myObject): $(localSrc) $(LINKLIBS)
        $(CXX) $(CPPFLAGS) $(INCFLAGS) -o $@ $^ $(LINKFLAGS) $(patsubst %,-l:%,$(LINKLIBS))
0 голосов
/ 08 июля 2010

Вы можете попробовать аргументы генерации зависимостей gcc вроде -MD, мне не ясно, используете ли вы их.

...