我正在按照Autotools页面上的使用检查的指示,试图在(当前)小型C项目中构建对单元测试的支持.虽然我使用的是Cgreen而不是Check.
我遇到了第9步的问题,这导致automake发出关于使用'%'的警告 - 样式模式规则是GNU make扩展.
具体的制定规则是:
check_%.$(OBJEXT) : $(srcdir)/%.c
$(COMPILE) -DCHECKING -c -o $@ $^
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种等效的方法来指定不依赖于gnu make扩展的规则.
我正在做一些Makefile重构,并试图找出实现Makefile的最简洁的方法,它执行以下操作:
这是我到目前为止:
...
OBJ_DIR = obj/
BIN_DIR = bin/
PROGRAM = program
SRCS = test1.cpp test2.c
OBJS = $(addprefix $(OBJ_DIR), \
$(patsubst %.cpp, %.o, \
$(patsubst %.c, %.o, $(SRCS))))
$(BIN_DIR)$(PROGRAM) : $(OBJS)
$(CREATE_OUT_DIR)
$(LINK)
$(OBJ_DIR)%.o : %.c
$(CREATE_OBJ_DIR)
$(CCOMPILE)
$(OBJ_DIR)%.o : %.cpp
$(CREATE_OBJ_DIR)
$(CPPCOMPILE)
...
Run Code Online (Sandbox Code Playgroud)
我想为每个.o编译消除对$(CREATE_OBJ_DIR)的调用.有人知道怎么做吗?我尝试添加这个,但它不会构建目标文件:
$(OBJS): | $(OBJ_DIR)
$(OBJ_DIR):
$(CREATE_OBJ_DIR)
Run Code Online (Sandbox Code Playgroud) 我是学习make文件的新手.我正在读这篇文章.有谁能告诉我什么是$@变量用于makefile内部?
有没有办法告诉automake不要解释部分Makefile.am?
具体来说,我试图在Makefile.am中编码Makefile条件.正如其他人注意到的那样,这不起作用,因为automake解释了endif结构.
有没有办法逃脱或引用Makefile.am文件中的字符串,以便automake逐字复制到目标Makefile?具体来说,我不希望它在以下内容中解释endif:
ifeq "$(SOMEVAR)" ""
SOMEVAR="default_value"
endif
Run Code Online (Sandbox Code Playgroud) 我是Linux和makefile的新手.我有一个生成.a文件的makefile.当我运行makefile时,我收到以下错误.我不知道代码的哪一部分,错误发生.
[oracle@dyl02703app004 erm]# make -f erm_make_ida all
.... Compiling /home/wholesale/children/dev5/comps/erm/obj/ermparseyac.c
cc -g -DANSI -D -DTRACE_ON -DIDA_VERSION='"ISP-RG-V5.10.7GEN2A"' -DNO_MCP -DBUILDING_ERP -I/home/wholesale/children/dev5/comps/erm/include -I/home/wholesale/children/dev5/comps/erm/src -I/home/wholesale/children/dev5/comps/erm/module_test -I/home/wholesale/children/dev5/comps/erm/include -I/home/wholesale/children/dev5/comps/cfm/include -c /home/wholesale/children/dev5/comps/erm/src/ermparseyac.c -o /home/wholesale/children/dev5/comps/erm/obj/ermparseyac.o
<command line>:1:1: error: macro names must be identifiers
make: *** [/home/wholesale/children/dev5/comps/erm/obj/ermparseyac.o] Error 1
Run Code Online (Sandbox Code Playgroud)
有什么建议...?
我正在尝试在Ubuntu中编译以下程序.但我一直收到错误:"stdio.h:没有这样的文件或目录"错误.
#include <stdio.h>
int main(void)
{
printf("Hello world");
}
Run Code Online (Sandbox Code Playgroud)
我的makefile是:
obj-m += hello.o
all:
make -I/usr/include -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试编写一个Makefile,以正确构建包含git子模块的项目。该子模块具有自己的makefile集,并一次生成多个目标,包括一些库。
此Makefile应该具有以下属性。
只是为了设定想法,这似乎是可行的。
FOO_SUBDIR := $(CURDIR)/foo
LDFLAGS := -L$(FOO_SUBDIR)
FOO_LIBSFILES := $(FOO_SUBDIR)/libfoo.a $(FOO_SUBDIR)/libgnufoo.a
FOO_LDLIBS := -lfoo -lgnufoo
.PHONY: all
all: main
# There are theoretically 3 main binaries
main: main.c $(FOO_LIBSFILES)
gcc -o $@ $< $(LDFLAGS) $(FOO_LDLIBS)
$(FOO_LIBSFILES): libfoo
@# Do nothing
.PHONY: libfoo
libfoo:
$(MAKE) -C $(FOO_SUBDIR)
Run Code Online (Sandbox Code Playgroud)
我添加了空食谱似乎很有效,但我不明白为什么。
这个想法是始终依靠子模块的Makefile进行重建(或不重建)libfoo.a和libgnufoo.a,并让主Makefile决定是否main需要重建。没有空食谱,它是行不通的。当foo/foo.c被修改,然后libfoo.a重新生成,但make不重建main。
我有一种空的配方强制检查目标文件的日期的感觉。但是我找不到有关此行为的文档。
这是正确的方法吗?我应该注意的任何陷阱?还有什么比较晦涩的方法吗?或有关此行为的任何文档?
提前致谢。
我想根据是否启用并行构建来设置一些变量,因此我尝试了以下操作:
jobs:
»·echo "executing jobs job"
ifneq (,$(findstring -j,$(MAKEFLAGS)))
»·$(warning "parallel!")
else
»·$(warning "not parallel!")
endif
Run Code Online (Sandbox Code Playgroud)
这就是发生的情况:
$ make -j2
Makefile:2: "not parallel!"
echo "executing jobs job"
executing jobs job
Run Code Online (Sandbox Code Playgroud)
我也尝试过测试$(JOBS),但是没有运气。
我有办法告诉Makefile内部是否使用了--jobs参数吗?
附加信息:
$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-pc-linux-gnu
Run Code Online (Sandbox Code Playgroud) 最近,我用vim文本编辑器编写了一个没有文件扩展名的文本文件,并用高亮显示了单行引号(如)'word'和以冒号(如)结尾的所有单词。word:
我喜欢这种突出显示。
但是因为我没有键入任何通常以开头的命令,所以ESC :command我很惊讶这是怎么发生的。
是否有命令显示正在使用的实际语法突出显示?
我已经尝试过:set syntax=php似乎只用不同颜色的命令类似的命令word:
有人有建议吗?
我有这个文件夹结构:
我编写了一个简单的函数来测试文件夹结构,以查看是否所有头文件都存在,但是当我使用make命令进行编译时,出现以下错误:
警告:函数“ stampa”具有内部链接,但未定义
我的lagrange.h文件我有这个:
#ifndef LAGRANGE_H
static void stampa(int i);
#endif /* LAGRANGE_H */
Run Code Online (Sandbox Code Playgroud)
在lagrange.c文件中我有这个:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <stdio.h>
void stampa(int i){
printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)
最后,int main.c我只是简单地调用stampa传递给他们一个数字的函数。
gnu-make ×10
makefile ×8
c ×3
automake ×2
command-line ×1
compilation ×1
file-type ×1
gcc ×1
git ×1
linux ×1
portability ×1
ubuntu ×1
unix ×1
vim ×1