下面的示例代码中的dep2函数有什么问题?
dep1 = $(eval makefile_list_$1 := $(MAKEFILE_LIST))$(eval -include $1.mk)$(eval MAKEFILE_LIST := $(makefile_list_$1))
define dep2
$(eval makefile_list_$1 := $(MAKEFILE_LIST))
$(eval -include $1.mk)
$(eval MAKEFILE_LIST := $(makefile_list_$1))
endef
$(call dep1,test)
$(call dep2,test)
.DEFAULT_TARGET: all
.PHONY: all
all:
@echo $@
Run Code Online (Sandbox Code Playgroud)
GNU make 3.81和3.82产生Makefile:10: *** missing separator. Stop.指向dep2调用,dep1运行没有错误.两个变体之间的唯一区别是dep2中的换行符(以及我想使用define的全部要点).
在GNU使手动说
有可能不止一个模式规则符合这些标准.在这种情况下,make将选择具有最短词干的规则(即,最具体匹配的模式).
所以它让我感到惊讶:
$ touch make_specific.cpp
$ cat Makefile.general_first
%.o: %.cpp
@echo using general rule
$(CXX) -c $< -o $@
%_specific.o: %_specific.cpp
@echo using specific rule
$(CXX) -c $< -o $@
$ make -B -f Makefile.general_first make_specific.o
using general rule
g++44 -c make_specific.cpp -o make_specific.o
Run Code Online (Sandbox Code Playgroud)
多模式规则匹配目标,并因为对干%_specific.o : %_specific.cpp规则(在这种情况下,"制作")比杆的短%.o : %.cpp规则,我预期的要选择的特定规则,但事实并非如此.
我错过了什么?
我有一个makefile模板来编译单个DLL(对于插件系统).用户的makefile如下所示:
EXTRA_SRCS=file1 file2
include makefile.in
Run Code Online (Sandbox Code Playgroud)
在makefile.in我有:
plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
Run Code Online (Sandbox Code Playgroud)
plugin.os要编译的主要C++文件在哪里.顺便说一句,文件结尾是.os为共享库编译的目标文件(即使用-fpic选项gcc)
现在,问题是额外的源可能(但不一定)是头文件.理想情况下,我想将它们添加为目标plugin.os和它们的依赖项file.cpp,但前提是它们存在.
该方法应适用于Windows和Linux,或至少适用于每个.但是,我只使用了GNU版本的make.
这是我目前的makefile.
CXX = g++
CXXFLAGS = -Wall -O3
LDFLAGS =
TARGET = testcpp
SRCS = main.cpp object.cpp foo.cpp
OBJS = $(SRCS:.cpp=.o)
DEPS = $(SRCS:.cpp=.d)
.PHONY: clean all
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $(TARGET)
.cpp.o:
$(CXX) $(CXXFLAGS) -c $< -o $@
%.d: %.cpp
$(CXX) -M $(CXXFLAGS) $< > $@
clean:
rm -f $(OBJS) $(DEPS) $(TARGET)
-include $(DEPS)
Run Code Online (Sandbox Code Playgroud)
它有一个例外,完美地工作.如果目录已经是干净的(没有*.d,*.o)并且我运行'make clean',它会重新创建依赖项,然后立即删除它们:
[user@server proj]$ make
g++ -M -Wall -O3 foo.cpp > foo.d
g++ -M -Wall -O3 object.cpp > object.d
g++ …Run Code Online (Sandbox Code Playgroud) GNU如何决定发出哪些消息?我正在使用的Makefile导致在目标启动日期时发出"目标"消息无法执行任何操作.但我认为"目标"是最新的更合适.
我想要一个模式规则,其中包含从词干和使用通配符构建的依赖关系,即类似的东西
$(FILES): %.o: %.c $(wildcard %*.c)
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用:词干%不在通配符函数内扩展(参见http://www.gnu.org/software/make/manual/html_node/Pattern-Rules.html),而自动变量$*列出依赖项时似乎无法识别.
做这样的事情是否有(不太愚蠢)的方式?
我正在尝试在二进制文件中指定rpath.我的makefile看起来像这样 -
CC=gcc
CFLAGS=-Wall
LDFLAGS= -rpath='../libs/'
main: main.c
gcc -o main main.c
clean:
rm -f main main.o
Run Code Online (Sandbox Code Playgroud)
但是当我使用命令查询rpath时,我readelf -a ./main | grep rpath没有得到任何东西我已经尝试指定rpath,LDFLAGS= "-rpath=../libs/"但即使这似乎也不起作用.
有人可以发一个例子来说明我应该如何在makefile中指定rpath?
GCC和ld版本是 -
gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
GNU ld (GNU Binutils for Ubuntu) 2.21.0.20110327
Run Code Online (Sandbox Code Playgroud) 我有一个庞大的项目,大约有150,000个LOC的C++代码.建设时间约为15分钟.该项目由许多不同规模的子项目组成.
我为每个子项目构建了单独的预编译头,但是当我使用它们时,构建时间保持大致相同.似乎构建时间减少了5-10%,而不是更多.
绝对使用预编译的头文件,我使用-Winvalid-pch选项,我尝试使用编译-H器选项进行编译,我的预编译头文件在输出中出现'bang'符号,这意味着编译器能够使用预编译头文件.
我所有预编译的头文件都不是很大,每个文件大约有50Mb.我使用python脚本,在这里生成最常用的预编译头文件列表,所以我的预编译候选列表非常好.
是否有用于构建优化的免费/开源工具?标准make实用程序似乎无法测量不同目标的构建时间.我无法找到获取不同目标统计数据的方法make.我不是在谈论依赖性分析或者先进的东西.我只是想知道大部分时间浪费在哪些目标上.
此外,GCC似乎在处理预编译头文件方面效率很低.我无法让任何子项目构建速度明显更快,我得到的最大加速比例是20%,对于一个需要三分钟构建的项目.使用固态硬盘购买速度更快的机器似乎比使用GCC优化Linux上的构建时间更容易和更便宜.
来自文档:
$(patsubst PATTERN,REPLACEMENT,TEXT)
在TEXT中查找与PATTERN匹配的以空格分隔的单词,并将其替换为REPLACEMENT.这里PATTERN可以包含一个%充当通配符的字符串,匹配单词中任意数量的任何字符.
......
单词之间的空格被折叠成单个空格字符; 前导和尾随空格被丢弃.
现在,给定一个makefile,是:
# The pattern for patsubst, does NOT contain '%'
foo := $(patsubst x,y,x x x)
# The pattern for patsubst, does contain '%'
bar := $(patsubst x%,y,x x x)
# The variable 'foo', is a result from a patsubst-pattern, that did NOT contain a '%'
# The variable 'bar', is a result from a patsubst-pattern, that did contain a '%'
all ::
@echo 'foo is: "$(foo)"' …Run Code Online (Sandbox Code Playgroud) 在 msys2 上,我安装了 mingw-w64 工具链。我可以从 MINGW64 shell 运行 gcc,但不能运行 make。pacman声称mingw-w64-x86_64-make已安装。是什么赋予了?