簡體   English   中英

Makefile更新了庫依賴項

[英]Makefile updated library dependency

我有一個大的makefile,它構建了幾個庫,安裝它們,然后繼續構建與這些已安裝的庫鏈接的對象。 我的麻煩是我想使用“-lfoo -lbar”作為g ++標志來鏈接兩個已安裝的庫,但依賴關系搞砸了。 如果我更改庫foo所依賴的標題“42.h”,那么make當然會重建並安裝它,但它似乎沒有注意到我的對象“marvin”使用了“-lfoo”而marvin是左鏈接的對舊版本...... :(

到目前為止,我一直在做:

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

但我現在已經不再是一個可行的選擇了。 我需要簡單地將庫“-lfoo -lbar”添加到LINKFLAGS變量並讓鏈接器解決問題?

與此同時,我已經使用了一些命令來明確地吹走有問題的目標文件,然后調用make,但這很愚蠢。 我很緊張,但如果有必要,我可以在周五晚上或周六早上發布一個小例子。

因此,我覺得我回到了一些糟糕的Windows版本地獄。 有什么我可以做的事情讓鏈接器注意到對象構建的庫的版本,並重新鏈接它,如果這些庫更改?

更新:所以到目前為止我還沒有機會崩潰這些建議。 我正在做的缺點是使用靜態庫。 所以我不能用ldd 所以我重寫了我的Makefile,找到了解決這個問題的方法。 如果我有時間,我會發布我所做的。

這個怎么樣:

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)

據我所知,make一般不會很好地自動檢測這樣的依賴關系。 (這不是真正的工作; make是一個更高級別的工具,它不知道它產生的命令的細節或這些命令的作用。)

我想到了兩種選擇。

首先,您可以在$(myObject)上運行ldd ,將其庫列表保存到文本文件中,然后將其作為依賴項列表反饋到您的makefile中。 (這類似於使用-MD將頭文件列表保存到文本文件中,然后將其作為源文件編譯的附加規則反饋到makefile中,正如Sam Miller建議的那樣。)

其次,您可以使用LINKLIBS變量,並使用GNU Make的函數讓相同的變量適用於依賴項和命令行選項。 例如:

LINKLIBS := /explicit/path/to/lib/libfoo.so
$(myObject): $(localSrc) $(LINKLIBS)
        $(CXX) $(CPPFLAGS) $(INCFLAGS) -o $@ $^ $(LINKFLAGS) $(patsubst %,-l:%,$(LINKLIBS))

您可以嘗試像-MD這樣的gcc依賴生成參數,如果您使用它們,我不清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM