[英]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.