标签: makefile

为什么先决条件的顺序在makefile中很重要?

我刚刚学习如何创建makefile并意识到规则的先决条件中的头文件和目标文件的顺序很重要,但我不明白为什么.

我和许多同学一起研究和交谈,并且有很多猜测,但没有人有答案.

我知道在编译的预处理步骤中,头文件和源文件中的代码都包含在目标文件中,所以如果我将目标文件和头文件作为先决条件传递,为什么这很重要?

我问,因为如果缺少头文件,我的Makefile不应该编译.

这是代码:

CC = gcc
SRC = main.c file1.c
OBJ = $(SRC:.c=.o)
NAME = my_executable
all: header.h $(OBJ)    
     $(CC) $(OBJ) -o $(NAME)
Run Code Online (Sandbox Code Playgroud)

c makefile

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

在Make规则中分割字符串

我试图在Make target中用冒号分隔的值分割字符串。

当我尝试使用for循环,eval,shell分割目标配方中的字符串时,得到空白值。当我确实使用shell命令在目标结果之外拆分字符串时,结果是肯定的。

谁能帮我解决目标食谱。

以下是代码段。

notebooks=new:e7e45d89-94cc-4783-86c5-2236d9904a24 test:2af1d689-98c3-48f2-984d-2ea21c5135dd
j=new:e7e45d89-94cc-4783-86c5-2236d9904a24
f1=$(shell echo $j | cut -d: -f 1)
test1:
    @for i in $(notebooks); \
    do \
        $(eval f=$(shell echo $i | cut -d: -f 1))  \
        $(eval fid=$(shell echo $i | cut -d: -f 2)) \
        echo $(f) $(fid) $(f1) ;\
    done
Run Code Online (Sandbox Code Playgroud)

输出是

new
new
Run Code Online (Sandbox Code Playgroud)

而所需的输出是

new e7e45d89-94cc-4783-86c5-2236d9904a24 new 
test 2af1d689-98c3-48f2-984d-2ea21c5135dd new
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

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

如何使单个"makefile"创建3个输出二进制文件

谁能帮助我为我的项目创建一个makefile?我需要从makefile创建3个二进制文件.

二进制文件单独编译如下:

gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o serverThreaded

gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o server

(因此它创建了2个相同的二进制文件,但名称不同,serverThreaded和server)

而且我也需要makefile中的这个:

gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread client.c -o client

编辑:我认为这是我需要的?

all: serverThreaded server client

    gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o serverThreaded 
    gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o server 
    gcc -D_POSIX_SOURCE -Wall -Werror …
Run Code Online (Sandbox Code Playgroud)

c gcc makefile

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

Makefile到base64编码kubernetes的秘密

在Kubernetes中,秘密资源是base64编码的.这是官方文档中的示例yaml文件:

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  USERNAME: bXktYXBwCg==
  PASSWORD: YV44KXlcNzw4QUF4YWEoeV54
Run Code Online (Sandbox Code Playgroud)

两个秘密数据的位置:用户名和密码是base64编码使用:

echo -n 'my-app' | base64
echo -n 'a^8)y\7<8AAxaa(y^x' | base64
Run Code Online (Sandbox Code Playgroud)

我想要的工作流程是使用我的秘密的yaml文件版本,并且Makefile可以生成base64编码版本.

这是我遇到困难之前的所在:

输入(my-secrets-naked.yaml):

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  USERNAME: my-app
  PASSWORD: a^8)y\7<8AAxaa(y^x
Run Code Online (Sandbox Code Playgroud)

Makefile:

base64:
    @echo "Computing base64 of secret values..."
    cat my-secrets-naked.yaml | bash base64_secrets.sh > my-secrets-base64.yaml
Run Code Online (Sandbox Code Playgroud)

base64_secrets.sh脚本:

sed -r 's/(\s+[A-Z]\S+:\s*)(.*)/echo "\1$(echo -n "\2" | base64 -w0 )"/e;s/  -//'
Run Code Online (Sandbox Code Playgroud)

命令: make …

bash makefile sed kubernetes

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

Makefile没有针对目标的规则

当有明确的定义时,请抱怨目标'build/libc/string/strlen.c'没有规则.奇怪的是,它成功地为'build/libc/libc.a'编译了除了一个依赖项之外的所有依赖项.我曾经或者至少试图禁用内置隐式规则和变量,以避免花费数小时调试同时拔出头发,但它似乎没有帮助,因为我完全迷失了.

Makefile文件:

.SUFFIXES:

MAKEFLAGS += -rR

STD = gnu11
CFLAGS = -O2 -g -ffreestanding -fbuiltin -Wall -Wno-div-by-zero -D__is_vos_kernel__ -Iinclude
LFLAGS = -O2 -g -ffreestanding -fbuiltin -Wall -Wextra
LIBC_FLAGS = -O2 -g -D__is_vos_libc__ -Iinclude
LIBK_FLAGS = -O2 -g -ffreestanding -fbuiltin -D__is_vos_libc__ -Iinclude -D__is_vos_kernel__

CC = i386-elf-gcc
LD = i386-elf-ld
AR = i386-elf-ar
AS = /usr/local/bin/nasm

SYSROOT = sysroot
BUILDDIR = builddir

SYSARG = --sysroot=sysroot -isystem=/usr/include

LIBC_OBJECTS = $(wildcard libc/*.c)
LIBC_HEADERS = $(wildcard libc/*.h)
LLIBC_HEADERS = $(wildcard sysroot/usr/include/*.h)

header:=$(shell find libc -type …
Run Code Online (Sandbox Code Playgroud)

c makefile gnu-make

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

Makefile找不到libs

我正在尝试为我的项目编写Makefile.这是文件结构:

在此输入图像描述

Makefile文件:

CXXFLAGS = -ISDL2/include -std=c++11
LXXFLAGS = -lSDL2/lib/x86 -lSDL2main -lSDL2 -lSDL2_image

main.exe: main.o BoardField.o ChessPiece.o Game.o
    g++ main.o BoardField.o ChessPiece.o Game.o -o main.exe $(LXXFLAGS) -std=c++11

main.o: main.cpp 
    g++ main.cpp -c $(CXXFLAGS)

BoardField.o: BoardField.cpp 
    g++ BoardField.cpp -c $(CXXFLAGS) 

ChessPiece.o: ChessPiece.cpp 
    g++ ChessPiece.cpp -c $(CXXFLAGS) 

Game.o: Game.cpp 
    g++ Game.cpp -c $(CXXFLAGS)  
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

g ++ main.o BoardField.o ChessPiece.o Game.o -o main.exe -lSDL2/lib/x86 -lSDL2main -lSDL2 -lSDL2_image -std = c ++ 11 c:/ mingw/bin /../ lib/gcc /mingw32/6.3.0/../../../../mingw32/bin/ld.exe:找不到-lSDL2/lib/x86 c:/ mingw/bin /../ lib/gcc/mingw32 /6.3.0/../../../../mingw32/bin/ld.exe:找不到-lSDL2main c:/ mingw/bin …

c++ gcc makefile g++ linker-errors

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

如何在变量赋值中获得"最多一次"语义?

Shell命令有时需要很长时间才能运行,因此您可能不想这样做VAR = $(shell slow-cmd) (=每次引用变量时都会运行slow-cmd).使用VAR := $(shell slow-cmd)可能很有用,但是如果您正在构建一个不需要扩展变量的目标,那么您将获得slow-cmd比所需更多的调用.在下面的makefile(使用gnu-make)中,您可以获得所需的行为:定义V2值的shell命令永远不会被多次调用,而对于目标,foo它根本不会被调用.但这是一个令人发指的污垢.是否有更合理的方法来确保变量仅在需要时定义,但从未评估过多次?

V1 = $(shell echo evaluating V1 > /dev/tty; echo V1 VALUE)

all: foo bar V2
        @echo $(V1) $@
        @echo $(V2) $@

foo:
        @echo $(V1) $@

bar: V2
        @echo $(V1) $@
        @echo $(V2) $@

V2:
        $(eval V2 := $(shell echo evaluating V2 > /dev/tty; echo V2 VALUE))

.PHONY: all foo bar
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

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

我的makefile没有找到我的包含路径

简单地说:它没有找到包含路径:

CC = g++
OBJS = *.o #*/*.o

DEBUG = -g
PNAME = game
INCLUDES = -Iheaders

CFLAGS = -Wall $(DEBUG)
LFLAGS = -Wall -lsfml-graphics -lsfml-window -lsfml-system $(DEBUG)

all: build

build: $(OBJS)
    $(CC) $(LFLAGS) $(OBJS) -o $(PNAME)

clean:
    \rm *.o *~ $(PNAME)

.cpp:
    $(CC) $(CFLAGS) $(INCLUDES) -c $(.SOURCE)
Run Code Online (Sandbox Code Playgroud)

c++ gcc makefile include-path

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

为了完全使用gcc/g ++编译器的所有功能,我需要学习哪些概念?

你能解释一下这些选项在下面的g ++命令中构建boost.python对象的含义吗?

# location of the Python header files
PYTHON = /usr/include/python2.7

# location of the Boost Python include files and library

BOOST_INC = /usr/include
BOOST_LIB = /usr/lib

# compile mesh classes
TARGET = ex1

$(TARGET).so: $(TARGET).o
        g++ -shared -Wl,--export-dynamic \
        $(TARGET).o -L$(BOOST_LIB) -lboost_python \
        -L/usr/lib/python2.7/config -lpython2.7 \
        -o $(TARGET).so

$(TARGET).o: $(TARGET).c
        g++ -I$(PYTHON) -I$(BOOST_INC) -c $(TARGET).c
Run Code Online (Sandbox Code Playgroud)

做什么:

  • WL
  • --export动态
  • 共享

意思?

我应该学习哪些其他概念来充分利用gcc/g ++编译器以及构建实用程序?编辑:我不需要所有这些,但最常用的功能是什么?

有没有更好的方法来确切地知道,我需要链接到构建所需的库?目前,我只能做猜测来弄清楚要链接的内容,即如果我使用Boost的日期时间库,我做了-lboost_date_time这样的事情,它只是起作用,但有时不适用于其他库.

另外,对于boost.python,我不想使用Bjam,因为它需要花费很多时间来学习,文档似乎含糊不清.make实用程序对我来说似乎更普遍.但是,有没有一个ide可以自动化构建过程,如Windows中的MSVS?代码::块?手动编写makefile比IDE管理的优点是什么?它似乎可以节省大量的构建自动化时间.

c++ boost makefile build

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

make有什么问题?

C

#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
    printk(KERN_INFO "Hello world 1.\n");
    return 0;
}
void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}
Run Code Online (Sandbox Code Playgroud)
/* makefile */
/* uname -r = 2.6.32-5-686 */
obj-m += hello.o
all :
    make -C /lib/modules/2.6.32-5-686/build /home/mgh/Documents modules
clean : 
    make -C /lib/modules/2.6.32-5-686/build /home/mgh/Documents clean
Run Code Online (Sandbox Code Playgroud)
root@localhost:/home/mgh/Documents# make
make -C /lib/modules/2.6.32-5-686/build /home/mgh/Documents modules
make[1]: Entering directory /usr/src/linux-headers-2.6.32-5-686'
/usr/src/linux-headers-2.6.32-5-common/scripts/Makefile.build:44: /usr/src/linux-headers-``2.6.32-5-common/scripts/basic/Makefile: No such file or directory
make[5]: *** No rule to make target `/usr/src/linux-headers-2.6.32-5-common/scripts/basic``/Makefile'.  Stop.
make[4]: *** [scripts_basic] Error …
Run Code Online (Sandbox Code Playgroud)

c linux module makefile header

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

标签 统计

makefile ×10

c ×4

c++ ×3

gcc ×3

gnu-make ×3

bash ×1

boost ×1

build ×1

g++ ×1

header ×1

include-path ×1

kubernetes ×1

linker-errors ×1

linux ×1

module ×1

sed ×1