我正在尝试调试复杂的Makefile.你如何让GNU make打印它运行的所有命令?我在man页面中找不到答案(使用-d标志似乎不打印它).
(这不是回答我的问题的必要信息,但是如果你想知道:我在编译基于NVIDIA的CUDA库的项目时遇到了问题.我可以自己编译它,但是使用它们的Makefile导致一个讨厌的编译器错误我想使用他们提供的Makefile来更容易打包,并包含他们已经链接过的其他包.)
在这一行:
GCCVER:=$(shell a=`mktemp` && echo $'#include <stdio.h>\nmain() {printf("%u.%u\\n", __GNUC__, __GNUC_MINOR__);}' | gcc -o "$a" -xc -; "$a"; rm "$a")
Run Code Online (Sandbox Code Playgroud)
我明白了:
*** unterminated call to function `shell': missing `)'. Stop.
Run Code Online (Sandbox Code Playgroud)
我愚蠢的迂回变量出了什么问题?
$ make --version
GNU Make 3.81
$ bash --version
GNU bash, version 4.2.8(1)-release (x86_64-pc-linux-gnu)
$ uname -a
Linux 2.6.38-10-generic #46-Ubuntu SMP x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
Run Code Online (Sandbox Code Playgroud) 我试图构建和编译我的程序时遇到此错误.现在我无法打开程序中的所有.cpp文件.
make [2]:*没有规则来制作目标
Checker.cpp', needed by构建/调试/ GNU-Linux-x86/Checker.o'.停止.
有人可以帮我这个吗?我检查了所有在线资源,但我似乎无法找到解决方案.我迫切需要这个解决.感谢给予的任何帮助.
我使用make的shell命令来填充一些变量,并在输出时指示它们被设置为我期望的值.然而,当我把它们传递给我的制作食谱时,它们都显示为空.我怀疑make正在对结果做一些奇怪的解析.例如:
MyTarget: $(MySources)
LINE='$(shell cat $< | grep GIMME_THE_LINE_I_WANT)'
CH9=$(shell echo $(LINE) | cut -b9)
echo $(CH9) # doesn't print anything
Run Code Online (Sandbox Code Playgroud)
我通过设置手动检查了我的生成器命令SHELL=sh -XV,当我运行相同的命令时,我得到正确的值,它看起来像bash是'归零'我的变量.知道什么是错的吗?
我想使用GNUMake来运行基于规则的makefile,它在目录结构中(在Windows文件系统上)构建一组C文件.
根目录,一些子目录和一些文件包含空格.
示例文件: "C:\Documents and Settings\<username>\My Documents\Test Dir\Build Me.c"
当文件路径包含空格时,GNUMake不起作用.我读过有关解决此问题的工作(从我的文件名去掉空格,使用8.3格式,替代空间的可能途径?或\\等),但他们都不是完美的(或者是他们?)
有没有银弹可以解决这个问题?
顺便说一下,我坚持使用GNUMake,我不能使用不同的制作工具.
有没有办法在 makefile 中知道 GNU make 是在 linux 操作系统还是 windows 操作系统上运行?
我已经构建了一个 bash 脚本,它生成一个用于构建我的应用程序的 makefile,它在我的 Debian 机器上运行良好。我想尝试在 MinGW/MSYS 上构建它,但问题是我必须构建和运行一些测试程序来检查源代码中的错误,而要在 Windows 上运行它,我必须添加 .exe 后缀。
我在OSX Lion上有一个构建文件
VPATH = src include
CFLAGS ="-I include -std=gnu99"
hello: hello.o
gcc $^ -o $@
hello.o: hello.h hello.c
gcc $(CFLAGS) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行此make文件时,我收到以下错误
ld: warning: ignoring file hello.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我已尝试使用该标志-arch x86_64但仍然得到相同的错误.
运行arch命令给出:i386.
uname …
在GNU make手册在解释这一部分不擅长,我找不到解释或者我不能推断其他地方的信息.
我知道%是一种通配符,但之间有什么区别%和*的背景下targets,dependencies和commands?我在哪里可以使用它,到处都有相同的含义?
target: dependencies ...
commands
Run Code Online (Sandbox Code Playgroud) 在中make,是否可以为每个目标定义前食谱和后食谱?
我想(隐式)在显式配方的第一行上方插入前食谱,然后(隐式)在显式配方的最后一行之后插入后食谱。
使用正则表达式插入行会很容易,但是隐式行会更干净。
我正在尝试在 Makefile 中设置一个环境变量,以便它可以在 sam shell 中运行的另一个程序中使用make,但是在make运行之后。
更新:根据已接受的带有评论的答案,这是不可能的。
脚步:
make test设置环境:export TEST_ENV_ONE=OneStringTEST_ENV_ONE试过这个:
不工作:
test:
export TEST_ENV_ONE=OneString
$(shell export TEST_ENV_TWO=TwoString)
Run Code Online (Sandbox Code Playgroud)
之后这是空的:
echo $TEST_ENV_ONE
echo $TEST_ENV_TWO
Run Code Online (Sandbox Code Playgroud) gnu-make ×10
makefile ×7
bash ×2
c++ ×2
gcc ×2
compilation ×1
filenames ×1
macos ×1
nvidia ×1
os-agnostic ×1
os-detection ×1
shell ×1
space ×1
windows ×1