我正在更新一些Makefiles從Make 3.81移動到3.82。在多個地方,原作者使用像這樣建立靜態庫:
all: lib$(library).a($objects)
這似乎構建每個.o文件將依次使用AR其插入到.A:
g++ -O2 <snip> -o some_obj.o some_cpp.cpp
ar rv libsome_lib.a some_obj.o
etc...
這個新版本的化妝,不過,與電抗器:
:*** No rule to make target 'libsome_lib.a()', needed by 'all'
我是否可以安全使用我已經習慣了這樣的方式替換該快捷方式
lib$(library).a: $(objects)
ar -rs lib$(library).a $objects
謝謝。
編輯
看起來我需要一個更好的Makefile教育。下面是從原來的Makefile中更大的摘錄:
CXXFLAGS += -O2 -g -Wall -Wunused-parameter \
`pkg-config --cflags gthread-2.0 glibmm-2.4 gtkmm-2.4`
libs += `pkg-config --libs gthread-2.0 glibmm-2.4` -lc
%.d: %.cpp
$(SHELL) -ec '$(CXX) -M $(CPPFLAGS) $(CXXFLAGS) $< \
| sed '\''s/\($*\)\.o[ :]*/\1.o [email protected] : /g'\'' > [email protected]; \
[ -s [email protected] ] || rm -f [email protected]'
%.d: %.c
$(SHELL) -ec '$(CXX) -M $(CPPFLAGS) $(CXXFLAGS) $< \
| sed '\''s/\($*\)\.o[ :]*/\1.o [email protected] : /g'\'' > [email protected]; \
[ -s [email protected] ] || rm -f [email protected]'
from_sources = $(patsubst %.c,$(2),$(filter %.c, $(1))) $(patsubst %.cpp,$(2),$(filter %.cpp, $(1)))
sources = $(shell cat sources.inc)
objects = $(call from_sources,$(sources),%.o)
depends = $(call from_sources,$(sources),%.d)
library = some_lib
.PHONY: all clean fresh
all: lib$(library).a($(objects))
clean:
<SNIP>
if neq($(MAKECMDGOALS),clean)
include $(depends)
endif
當這個3.81下運行,我得到的所有.D依賴性創建,然後作出啓動G ++荷蘭國際集團obj的文件。在3.82下,我得到了.d文件,但沒有.o,並且因爲「***沒有規則使......」而失敗。
爲了完整,您的意思是GNU Make? – beldaz 2010-12-16 03:38:25
@beldaz,對不起GNU Make。 – Mark 2010-12-16 03:41:38
[call function](http://www.gnu.org/software/make/manual/make.html#Call-Function)應該做什麼。請注意= type(而不是:= type)變量綁定的方式,導致它做了有趣的事情。我的疲倦的小腦子太聰明瞭。 – dmckee 2010-12-16 04:58:22