Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Makefile语法:静态库lib$(库).a($objects)_C++_Makefile_Static Libraries - Fatal编程技术网

C++ Makefile语法:静态库lib$(库).a($objects)

C++ Makefile语法:静态库lib$(库).a($objects),c++,makefile,static-libraries,C++,Makefile,Static Libraries,我正在更新一些Makefiles以从Make3.81迁移到3.82。在多个地方,最初的作者使用了类似这样的方法来构建静态libs: 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... 用我习惯的方式替换此快捷方式是否安全: lib$(library).a:

我正在更新一些Makefiles以从Make3.81迁移到3.82。在多个地方,最初的作者使用了类似这样的方法来构建静态libs:

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...
用我习惯的方式替换此快捷方式是否安全:

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 $@ : /g'\'' > $@; \
                      [ -s $@ ] || rm -f $@'
%.d: %.c
    $(SHELL) -ec '$(CXX) -M $(CPPFLAGS) $(CXXFLAGS) $< \
                      | sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
                      [ -s $@ ] || rm -f $@'

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
cxflags+=-O2-g-Wall-Wunused参数\
`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$@:/g'\''>$@\
[-s$@]| rm-f$@'
%d.d:%
$(SHELL)-ec'$(CXX)-M$(CPPFLAGS)$(CXXFLAGS)$<\
|sed'\''s/\($*\)\.o[:]*/\1.o$@:/g'\''>$@\
[-s$@]| rm-f$@'
from_sources=$(patsubst%.c,$(2),$(filter%.c,$(1))$(patsubst%.cpp,$(2),$(filter%.cpp,$(1)))
sources=$(壳牌cat sources.inc)
对象=$(从_源调用,$(源),%.o)
dependens=$(来自_源的调用,$(源),%.d)
库=一些库
.冒牌货:都是干净新鲜的
全部:lib$(库).a($(对象))
清洁:
如果neq($(MAKECMDGOALS),则清除
包括美元(视情况而定)
恩迪夫

当它在3.81下运行时,我会创建所有的.d依赖项,然后启动对obj文件的g++调用。在3.82下,我得到了.d文件,但没有.o和make失败,并出现“***没有规则生成…”

可能,但您没有明确的规则将类似
xyz.cpp
的内容转换为
xyz.o
,在尝试将源对象注入库之前,您可能需要这些内容。这可能有一个合适的隐式规则,所以首先检查

我要问的第一个问题是:
$objects
发生了什么,导致您首先尝试将
libsome_lib.a()
(即括号之间没有任何内容)作为目标

老实说,我倾向于尽可能避免这些包含规则,更喜欢依赖关系的显式语句(当然,除非有很多依赖关系)。是的,我知道这会使makefile变大,并将我标记为至少部分勒德主义者,但我更喜欢那些只起作用的东西,而不是那些聪明的东西


Cut'n'paste是我工具箱中最强大的工具之一:-)

可能,但是您没有明确的规则来将
xyz.cpp
之类的东西转换为
xyz.o
,在尝试将源对象注入库之前,您可能需要这些东西。这可能有一个合适的隐式规则,所以首先检查

我要问的第一个问题是:
$objects
发生了什么,导致您首先尝试将
libsome_lib.a()
(即括号之间没有任何内容)作为目标

老实说,我倾向于尽可能避免这些包含规则,更喜欢依赖关系的显式语句(当然,除非有很多依赖关系)。是的,我知道这会使makefile变大,并将我标记为至少部分勒德主义者,但我更喜欢那些只起作用的东西,而不是那些聪明的东西


剪切粘贴是我工具箱中最强大的工具之一:-)

你的方式看起来不错,但是如果旧的方式有效的话,旧的makefile肯定还有更多

哦,为了保持良好的状态,我建议:

lib$(library).a: $(objects)
     ar -rs $@ $^
编辑
不要因为不理解而感到难过;它有一个相当好的学习曲线

这里仍然没有足够的内容,但是如果
sources.inc
不是太大,您可以在3.81和3.82中尝试以下内容并查找差异:

experiment:
    @echo sources: $(sources)
    @echo objects: $(objects)
    @echo depends: $(depends)

到目前为止的证据是
对象在3.82下是空的,但是如果
.d
文件在3.82下重建,这表明
依赖于
不是空的,这很奇怪。

你的方式看起来不错,但是如果旧的方式有效的话,旧的makefile肯定还有更多

哦,为了保持良好的状态,我建议:

lib$(library).a: $(objects)
     ar -rs $@ $^
编辑
不要因为不理解而感到难过;它有一个相当好的学习曲线

这里仍然没有足够的内容,但是如果
sources.inc
不是太大,您可以在3.81和3.82中尝试以下内容并查找差异:

experiment:
    @echo sources: $(sources)
    @echo objects: $(objects)
    @echo depends: $(depends)
到目前为止的证据是
对象在3.82下是空的,但是如果
.d
文件在3.82下重建,这表明
依赖
不是空的,这很奇怪。

这是gnu make中支持的“归档成员”语法。对于我的口味来说,它与工具有点过于亲密,但它确实存在。原始错误可能是由$(对象)为空引起的。但我真的不确定。以下是一些文档:

11.1将成员作为目标归档

存档文件的单个成员可以用作目标或 制造中的先决条件。您可以在存档中指定名为member的成员 文件存档如下:

 archive(member)
此构造仅在目标和先决条件中可用,在配方中不可用!您可能在中使用的大多数程序 配方不支持此语法,不能直接对归档文件执行操作 成员。只有ar和其他专门设计用于运行的程序 关于档案可以这样做。因此,需要使用有效的配方来更新存档 成员目标可能必须使用ar。例如,此规则规定 通过复制hack.o文件在归档文件中创建成员hack.o:

 foolib(hack.o) : hack.o
         ar cr foolib hack.o
事实上,几乎所有存档成员目标都是以这种方式更新的,并且有一个隐式规则可以使用 为你做吧。请注意:如果 存档文件不存在

这是gnu make中支持的“归档成员”语法。有点太亲密了