我正在尝试在Linux上的Objective-C(Ubuntu)上构建hello world.main.c中
#import <Foundation/Foundation.h>
int main(void)
{
NSLog(@"asdasd");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不认为这里有错误.然后我创建了Makefile:
GNUSTEP_MAKEFILES = /usr/share/GNUstep/Makefiles
include $(GNUSTEP_MAKEFILES)/common.make
TOOL_NAME = main
main_OBJC_FILES = main.m
include $(GNUSTEP_MAKEFILES)/tool.make
Run Code Online (Sandbox Code Playgroud)
然后我运行"make":
This is gnustep-make 2.2.0. Type 'make print-gnustep-make-help' for help.
Making all for tool main...
make[1]: GNUmakefile: no such file or directory
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
让我用一个例子来说明它.
mkdir test
cd test
touch target
make target
Run Code Online (Sandbox Code Playgroud)
这将导致: make: Nothing to be done for 'target'.
所以make告诉我没有什么可做的.这是因为make没有找到规则target,但因为target已经存在的make告诉我没有什么可做的.
现在,我不希望这样.我希望make在找不到规则时给我一个错误target,即使target已经存在.
我尝试过以下方法:
echo '.DEFAULT:
echo make: *** No rule to make target `$@'. Stop.
false'> Makefile
Run Code Online (Sandbox Code Playgroud)
但是,这并不能阻止化妆使多个目标的时候.
由于未定义的变量只是简单地用空文本替换(考虑目标目录),因此可能导致意外行为,是否有办法检查变量是否未定义并在这种情况下停止并出现错误?
可以使用条件检测条件,但是如何停止执行?
ifeq ($(strip $(notdefinedforsure_man)),)
out = Undefined variable detected
endif
Run Code Online (Sandbox Code Playgroud)
我正在寻找像requiredef var1,var2这样的东西
或者在上述条件中使用的带有错误陈述的简单回报
我编写了简单的代码*make_test*来测试makefile的功能.文件夹结构如下:
include文件夹包含maths.h
float add(float a, float b)
{
return a+b;
}
Run Code Online (Sandbox Code Playgroud)主文件包含以下代码:
# include <stdio.h>
# include <include/maths.h>
int main(int argc, char** argv)
{
float a=1;
float b=4;
printf("%f + %f = %f\n", a, b, add(a, b));
return 0;
}
Run Code Online (Sandbox Code Playgroud)makefile包含以下内容:
IDIR = -I.
DEPS = ./include/maths.h
CC= gcc -Wall -g $(IDIR)
program: make_test.o
%.o: test/%.c $(DEPS)
@echo "Rule 1 was called"
$(CC) -o $@ $<
%.o: test/%.c $(DEPS)
@echo "Rule 2 was called"
$(CC) -o $@ $<
%.o: …Run Code Online (Sandbox Code Playgroud)我可以在Linux上的Makefile中设置PATH,但不能在Mac OS X中设置.在OS X中,PATH设置但不会被使用.这是一个演示:
在CentOS 6上使用bash 4.1.2(1)-release和GNU Make 3.81
$ pwd
/tmp/experiment
$ find * -type f -ls
132133 4 -rw-rw-r-- 1 tlim tlim 113 Aug 26 11:01 Makefile
132132 4 -rwxrwxr-x 1 tlim tlim 28 Aug 26 10:59 bin/myprog
$ cat Makefile
export PATH := $(shell /bin/pwd)/bin:$(PATH)
what:
@echo PATH=$$PATH
@echo PATH=$(PATH)
which myprog
myprog
$ cat bin/myprog
#!/bin/bash
echo HERE I AM.
$ make what
PATH=/tmp/experiment/bin:/usr/stack/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
PATH=/tmp/experiment/bin:/usr/stack/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
which myprog
/tmp/experiment/bin/myprog
myprog
HERE I AM.
Run Code Online (Sandbox Code Playgroud)
这是使用GNU Make 3.81在Mac OS …
我需要设计一个make文件,它将连续运行多个(类似命名的)程序.它还需要是可移植的,因为它将在CentOS和Solaris(非GNU)系统上使用.我之前从未真正使用过makefile中的循环.以下是我的尝试.不幸的是,它似乎只执行第一个程序.
CC = gcc
CFLAGS = -g -Wall #-Werror
SRCS := $(wildcard *.c)
PROGS := $(SRCS:.c=)
OBJS := $(SRCS:.c=.o)
all: $(PROGS)
run: $(PROGS)
$(foreach prog, $(PROGS), ./$(prog))
clean: $(PROGS)
rm $(PROGS)
Run Code Online (Sandbox Code Playgroud)
这是make run从终端运行的结果
./prog-14 ./prog-17 ./prog-20 ./prog-13 ./prog-18 ./prog-06 ./prog-07 ./prog-04 ./prog-19 ./prog-11 ./prog-03 ./prog-08 ./prog-12 ./prog-16 ./prog-21 ./prog-01 ./prog-10 ./prog-15 ./prog-05 ./prog-09 ./prog-02
in program 14
Run Code Online (Sandbox Code Playgroud) 我不知道为什么Make每次都会重新编译所有文件,包括未更改的文件,这会花费很长时间。我搜索了堆栈溢出并找到了一些解决方案,但仍然无法解决我的问题。
我应该如何更改此makefile,以便它不会编译所有文件,包括未更改的文件?
这是我的make文件:
CXX = g++
CXXFLAGS = -g -Wall -O2 -std=c++11
BIN = bin
SRC = src
OBJ = obj
COMPILER = $(BIN)/compiler
LEX_CPP = $(SRC)/lex.cpp
UTIL_CPP = $(SRC)/util.cpp
TOKEN_CPP = $(SRC)/token.cpp
MAIN_CPP = $(SRC)/main.cpp
TEST_CPP = $(SRC)/test.cpp
PARSER_CPP = $(SRC)/parser.cpp
COMPILER_CPP = $(SRC)/compiler.cpp
COMPILER_OBJS = parser.o compiler.o test.o token.o lex.o util.o main.o
dir_guard=@mkdir -p $(OBJ)
compiler: $(COMPILER_OBJS)
$(CXX) $(CXXFLAGS) -o $(COMPILER) $(OBJ)/lex.o $(OBJ)/compiler.o $(OBJ)/parser.o $(OBJ)/test.o $(OBJ)/token.o $(OBJ)/util.o $(OBJ)/main.o
main.o:
$(dir_guard)
$(CXX) $(CXXFLAGS) -o $(OBJ)/main.o -c $(MAIN_CPP)
lex.o:
$(dir_guard) …Run Code Online (Sandbox Code Playgroud) 我有一个Makefile,如下所示:
.ONESHELL:
SHELL = /bin/bash
.SHELLFLAGS = -e
clean:
rm -f foo
.PHONY: clean
Run Code Online (Sandbox Code Playgroud)
foo不存在.当我在Debian上运行它时,GNU Make 4.1我得到了这个错误:
rm -f foo
/bin/bash: rm -f foo: No such file or directory
Makefile:6: recipe for target 'clean' failed
make: *** [clean] Error 1
Run Code Online (Sandbox Code Playgroud)
当我在macOS上运行它时,GNU Make 3.81它按预期工作.如果我写-rm -f而不是,那没有区别rm -f.
为什么我会收到错误?bash -e -c "rm -f foo" ; echo $?在shell 0上运行打印在两个系统上.
我错过了什么吗?
我想gcc version 5.1.0 (tdm64-1)使用make文件在Windows 10 64位上使用编译器编译我的C程序.当我将make文件命名为makefileor时Makefile,它已成功编译.但是,当我将其命名为时MAKEFILE,它失败并且此错误显示:
mingw32-make: *** No targets specified and no makefile found. Stop.
Run Code Online (Sandbox Code Playgroud)
我想问的是这个错误只发生在Windows机器上或者会议禁止`MAKEFILE'用于生成文件文件名?
注意:在将此标记为重复之前,请阅读整个问题,
尤其是第5章:-)
假设你有一个大型的C-项目与众多.h和.c文件.但大多数文件从未使用过.这通常是嵌入式软件项目的情况.微控制器的每个外围设备的驱动程序都存在于项目的某个位置,但您通常只使用其中的一些.如果 - 例如 - 我使用usb驱动程序和uart驱动程序,我将导入我的相应.h文件main.c:
#include "stm32f7xx_usb.h"
#include "stm32f7xx_uart.h"
Run Code Online (Sandbox Code Playgroud)
好的......我过度简化了用例,但你明白了.
让我们就死文件的以下快速和脏定义达成一致:
死
.c文件是永远不会到达函数或数据的文件,因为.h不导入相应的文件.
我知道,这是一个非常不洁的定义.文件.c和.h文件之间并不总是存在一对一的关系.所以也许我应该说:
一
.c,如果没有它的功能/数据通过一个或多个进口暴露的文件已经死了.h的文件.
通常在嵌入式软件中,我们将这些import语句包含在一个#ifdef块中:
#ifdef USE_USB
#include "stm32f7xx_usb.h"
#endif
Run Code Online (Sandbox Code Playgroud)
这意味着状态"dead"或"alive"可以在编译时更改,具体取决于编译时注入的预处理器宏.因此,让我们假设在编译时注入的所有预处理器宏都是已知的.它们可以简单地在makefile中找到.
有时其中一个死文件有错误.当错误冻结整个编译过程时非常令人沮丧 - 特别是因为无论如何都不会使用该文件.在编译之前知道哪些文件已经死了,可能非常有用.
但我真的不知道可以使用什么工具.如何.
PS:当然,无论如何都应该运行某种预编译器或解析器.但那没关系.
我想我越来越接近这个目标了,但我还没有.我会告诉我现在的位置.
传递参数-ffunction-sections和-fdata-sectionsgcc编译器会在生成的目标文件中产生干净分离的函数和数据块.
接下来,我传递参数-Wl,--gc-sections和-Wl,--print-gc-sections海湾合作委员会链接.链接器启动所有不可缓存的数据和函数,从而产生更小的二进制文件.此外,链接器打印出他扔掉的东西:
...
ld.exe: Removing unused section '.text.HAL_UART_Receive_IT' in file …Run Code Online (Sandbox Code Playgroud)