标签: gnu-make

不能使用GNUstep在Objective-C上构建程序

我正在尝试在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)

我该如何解决?

linux objective-c gnu-make gnustep

1
推荐指数
1
解决办法
1725
查看次数

获取"make:'目标'无法执行任何操作"的错误

让我用一个例子来说明它.

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)

但是,这并不能阻止化妆使多个目标的时候.

makefile gnu-make

1
推荐指数
1
解决办法
2万
查看次数

如何验证是否定义了宏,否则停止make?

由于未定义的变量只是简单地用空文本替换(考虑目标目录),因此可能导致意外行为,是否有办法检查变量是否未定义并在这种情况下停止并出现错误?

可以使用条件检测条件,但是如何停止执行?

ifeq ($(strip $(notdefinedforsure_man)),)
out = Undefined variable detected
endif
Run Code Online (Sandbox Code Playgroud)

我正在寻找像requiredef var1,var2这样的东西

或者在上述条件中使用的带有错误陈述的简单回报

gnu-make

1
推荐指数
1
解决办法
248
查看次数

makefile自动执行操作

我编写了简单的代码*make_test*来测试makefile的功能.文件夹结构如下:

  1. include文件夹包含maths.h

    float add(float a, float b) 
    {
        return a+b;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 主文件包含以下代码:

    # 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)
  3. 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)

c makefile gnu-make

1
推荐指数
1
解决办法
78
查看次数

在Mac OS X上的Makefile中设置PATH(但它适用于Linux)

我可以在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 …

macos makefile gnu-make

1
推荐指数
1
解决办法
1387
查看次数

设计一个可移植的makefile循环

我需要设计一个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)

c loops makefile gnu-make

1
推荐指数
1
解决办法
142
查看次数

每次都会编译所有文件,包括未更改的文件

我不知道为什么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)

c++ makefile gnu-make

1
推荐指数
1
解决办法
619
查看次数

在GNU Make 4中使用"bash -e"作为shell时,rm -f无法丢失文件

我有一个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上运行打印在两个系统上.

我错过了什么吗?

bash makefile gnu-make

1
推荐指数
2
解决办法
112
查看次数

Makefile文件名约定

我想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'用于生成文件文件名?

c makefile gnu-make

1
推荐指数
1
解决办法
107
查看次数

如何识别大型C项目中的"死c文件"?

注意:在将此标记为重复之前,请阅读整个问题,
尤其是第5章:-)

1.用例

假设你有一个大型的C-项目与众多.h.c文件.但大多数文件从未使用过.这通常是嵌入式软件项目的情况.微控制器的每个外围设备的驱动程序都存在于项目的某个位置,但您通常只使用其中的一些.如果 - 例如 - 我使用usb驱动程序和uart驱动程序,我将导入我的相应.h文件main.c:

#include "stm32f7xx_usb.h"
#include "stm32f7xx_uart.h"
Run Code Online (Sandbox Code Playgroud)

好的......我过度简化了用例,但你明白了.

 

2.死文件

让我们就死文件的以下快速和脏定义达成一致:

.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中找到.

 

3.最终目标:
    在编译之前区分死文件

有时其中一个死文件有错误.当错误冻结整个编译过程时非常令人沮丧 - 特别是因为无论如何都不会使用该文件.在编译之前知道哪些文件已经死了,可能非常有用.
但我真的不知道可以使用什么工具.如何.

PS:当然,无论如何都应该运行某种预编译器或解析器.但那没关系.

 

4.不太有利的目标:
    编译后区分死文件

我想我越来越接近这个目标了,但我还没有.我会告诉我现在的位置.

传递参数-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)

c linker gcc makefile gnu-make

1
推荐指数
1
解决办法
139
查看次数

标签 统计

gnu-make ×10

makefile ×8

c ×4

bash ×1

c++ ×1

gcc ×1

gnustep ×1

linker ×1

linux ×1

loops ×1

macos ×1

objective-c ×1