我正在尝试为我的项目编写一个make文件,我正在尝试使用调试问题
make -n
Run Code Online (Sandbox Code Playgroud)
命令,我终于把它归结为
致命错误:无法创建/bin/st_driver.o:权限被拒绝
我不能为我的生活弄清楚发生了什么.
我的代码是
CC=gcc
CFLAGS=-g -Wall
TARGETS=st_driver
.PHONY: all clean dist
all: ./${TARGETS}
st_driver: bin/st_driver.o bin/st.o bin/er.o bin/hashtable.o
${CC} ${CFLAGS} -o st_driver bin/st_driver.o bin/st.o bin/er.o bin/hashtable.o
bin/st_driver.o: src/drivers/st_driver.c src/include/st.h
${CC} ${CFLAGS} -o /bin/st_driver.o -c src/drivers/st_driver.c
bin/st.o: src/st/st.c src/include/st.h
${CC} ${CFLAGS} -c src/st/st.c -o bin/st.o
bin/er.o: src/er/er.c src/include/er.h
${CC} ${CFLAGS} -c src/er/er.c -o bin/er.o
bin/hashtable.o: src/util/hashtable.c src/include/hashtable.h
${CC} ${CFLAGS} -c src/util/hashtable.o -o bin/hashtable.o
bin/list.o: src/util/list.c include/list.h
${CC} ${CFLAGS} -c src/util/list.c -o bin/list.o
clean:
rm -rf bin/*
run_valgrind: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下内容创建makefile:
$(CXX)=g++
$(SRC)=../src
$(INCL)=../include
all: cpu ram temperature swap statusshooter
$(CXX) main.cpp cpu.o ram.o temperature.o swap.o statusshooter.o -o main.o -I$(INCL) -Ofast -Wall -lyaml-cpp -lglog -lpqxx -lpq
cpu:
$(CXX) -c $(SRC)/CCpu.cpp -o cpu.o -Ofast -Wall
ram:
$(CXX) -c $(SRC)/CRam.cpp -o ram.o -Ofast -Wall
temperature:
$(CXX) -c $(SRC)/CTemperature.cpp -o temperature.o -Ofast -Wall
swap:
$(CXX) -c $(SRC)/CSwap.cpp -o swap.o -Ofast -Wall
statusshooter:
$(CXX) -c $(SRC)/CStatusShooter.cpp -o statusshooter.o -Ofast -Wall
Run Code Online (Sandbox Code Playgroud)
执行该makefile:
make CXX=g++-4.7抛出以下错误:
makefile:2: *** empty variable name. Stop.
Run Code Online (Sandbox Code Playgroud)
怎么解决这个?
这是我在make文件中更改的唯一一行,即在行中添加"*.cpp":
SRC = $(wildcard *.c *.cpp)
Run Code Online (Sandbox Code Playgroud)
这是makefile的干净目标:
# Target: clean project.
clean: begin clean_list end
clean_list :
@echo
@echo $(MSG_CLEANING)
$(REMOVE) $(OBJDIR)/$(TARGET).hex
$(REMOVE) $(OBJDIR)/$(TARGET).eep
$(REMOVE) $(OBJDIR)/$(TARGET).cof
$(REMOVE) $(OBJDIR)/$(TARGET).elf
$(REMOVE) $(OBJDIR)/$(TARGET).map
$(REMOVE) $(OBJDIR)/$(TARGET).sym
$(REMOVE) $(OBJDIR)/$(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(OBJDIR)/$(SRC:.c=.s)
$(REMOVE) $(OBJDIR)/$(SRC:.c=.d)
$(REMOVE) $(OBJDIR)/.dep/*
Run Code Online (Sandbox Code Playgroud)
当我运行makefile时,它会删除我的所有.cpp文件.我做错了什么?
提前致谢.乔
这是OBJ和LST的定义:
# Define all object files.
OBJ = $(addprefix $(OBJDIR)/,$(SRC:.c=.o)) $(addprefix $(OBJDIR)/,$(ASRC:.S=.o))
# Define all listing files.
LST = $(addprefix $(OBJDIR)/,$(SRC:.c=.lst)) $(addprefix $(OBJDIR)/,$(ASRC:.S=.lst))
Run Code Online (Sandbox Code Playgroud)
这是完整的make文件:
# Hey Emacs, this is a -*- makefile -*-
#---------------------------------------------------------------------------- …Run Code Online (Sandbox Code Playgroud) 有一些C代码:
apple.c
#include<stdio.h>
int main(void)
{
printf("apple\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Makefile文件
apple:
gcc -c $@.c
gcc $@.o -o $@
Run Code Online (Sandbox Code Playgroud)
$ make apple
它完美无缺.但如果我修改Makefile为:
apple:
gcc -c $1.c
gcc $1.o -o $1
Run Code Online (Sandbox Code Playgroud)
$ make apple
这是行不通的.是什么区别$@和$1当只有一个参数?
我有最新的Ubuntu LTS和Intel OpenCL驱动程序.我需要构建ImageMagick库,因此它将启用OpenCL但我无法弄清楚如何执行此操作.我想从源代码构建它,以便我自己可以修补它.
我从GitHub的官方镜像中获得了ImageMagick 7.0 .图书馆的网站上列出了对OpenCL的支持,但遗憾的是文档非常分散且错综复杂.
我用./configure(没有args)和make make install.当然,根据提示,不提供对OpenCL的支持convert -version.为了实验,我写了一个调用的C++程序image.blur(6, 1.5).在库的构建之前,我BlurImage()在MagickCore\effect.c中添加了一个小片段,它创建了一个文件并向其中提示了一些字符串.
我得到了模糊的图像和发出的文件,所以图书馆似乎工作.现在我需要使用OpenCL构建它.
我执行了./configure --enable-opencl LIBS=-ldl.当我从这个执行构建库时,提出convert -version了OpenCL支持.
据我了解ImageMagick的源代码,OpenCL内核保存在MagickCore\accelerate-private.h和编译运行时.调用加速函数的C中的实际代码存储在MagickCore\accelerate.c中.我做了同样的动作,并将该文件创建片段放入AccelerateBlurImage()功能中.我得到了模糊的图像,但没有创建文件,因此即使声明了OpenCL功能,也从未调用此函数.
我注意到的奇怪的事情是效果函数的加速对应物中没有一个实际上被称为其他任何地方.所以我无法意识到如何使用OpenCL支持功能.
我注意到的另一个奇怪的事情就是结果diff Makefile_without_OpenCL Makefile_with_OpenCL.Makefile_without_OpenCL是Makefile由./configure命令创建的,Makefile_with_OpenCL是由Makefile创建的./configure --enable-OpenCL LIBS=-ldl.结果显示后一个文件还包括-pthreadflag和-ldllib,但没有使用与OpenCL实际相关的内容.
我是否出错并且OpenCL已经在使用中,即使AccelerateBlurImage()没有调用函数?如果不是这样,那么使用OpenCL构建ImageMagick的正确流程是什么?
所以我遇到了一个问题,即某段代码给了我这个错误*** BUFFER OVERFLOW DETECTED ***.一旦我打开某些编译器优化选项(这不是我的程序,所以我必须使用这些),这才开始发生.我把它缩小到了它的选择范围.我还找到了一种方法来阻止缓冲区溢出,但是,我在程序的另一部分中有非常相似的代码,当我保留它时不会给我相同的错误.这使我对我的修复非常困惑和非常不自信,所以一些指导将不胜感激.
以下是来自的优化选项 makefile
CXXFLAGS+=-Os -O2 -fomit-frame-pointer
CXXFLAGS+=-fno-aggressive-loop-optimizations
Run Code Online (Sandbox Code Playgroud)
我把它缩小到-O2开始导致错误的标志.
这是realpath()仅在-O2指定了标志时才在缓冲区溢出时失败的函数
static std::string getRealTargetPath (std::string baseTarget)
{
char nextTargetLink[MAXPATHLEN];
memset (nextTargetLink, 0, MAXPATHLEN);
if (realpath (baseTarget.c_str(), nextTargetLink) == NULL)
return "";
else
//etc...
}
Run Code Online (Sandbox Code Playgroud)
如果我将MAXPATHLEN(大小1024)更改为PATH_MAX(大小4096),则上述函数将按预期运行.好,可以.但是,以下代码片段在使用与 std::string baseTarget之前相同的代码后执行~20行.
char realLinkPath[MAXPATHLEN];
memset (realLinkPath, 0, MAXPATHLEN);
do
{
if (realpath (linkPath.c_str(), realLinkPath) != NULL)
if (strcmp(linkPath.c_str(), realLinkPath) != 0)
return true; …Run Code Online (Sandbox Code Playgroud) 我正在浏览本教程,我必须创建此make文件:
CFLAGS=-wall -g
clean:
rm -f ex1
Run Code Online (Sandbox Code Playgroud)
然后我make在本教程中使用了上面的文件,并运行以下命令:
$ make ex3
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我得到以下输出:
cc -wall -g ex3.c -o ex3
clang: error: unknown argument: '-wall'
make: *** [ex3] Error 1
Run Code Online (Sandbox Code Playgroud)
为什么我收到错误?我该如何解决?
谢谢.
我有一个(GNU)make文件,有两个像这样的依赖:
INP ?= main
DEPS ?= bibliography.bib
# md-->tex rule
%.tex: %.md $(DEPS)
panzer -o $@ $<
# tex-->pdf rule
%.pdf: %.tex
latexmk $<
.PHONY: show
show: $(INP).pdf
showpdf $<
Run Code Online (Sandbox Code Playgroud)
这可以按预期工作:通过首先调用md - > tex规则,然后是tex - > pdf,最后是showpdf规则,在markdown文件发生变化时,make show从main.md(或我指定的任何其他markdown文件)创建并显示PDF .
现在我想添加一个force触发规则的目标md - > tex, tex - > pdf和showpdf,无论状态如何main.md.
从这个答案我试着
force:
rm $(INP).pdf
make show
Run Code Online (Sandbox Code Playgroud)
但这不是很优雅而且相当脆弱. - 我怀疑必须有一种方法可以在当前的make调用中创建一个目标来说:
假设规则X(此处
show …
在我的makefile中,我将链接器标志的参数添加为变量 BOOTLOAD
LDFLAGS += -Wl,--section-start=.bootloader=$(BOOTLOAD)
Run Code Online (Sandbox Code Playgroud)
如果我BOOTLOAD = 0x3800在makefile中写一切正常.
但我想从C代码传递这个变量,所以我试着定义它#define BOOTLOAD 0x3800.但链接器找不到它.
我应该如何BOOTLOAD从C文件传递?
我有一个目录,其中包含两个文件夹,src并且binmakefile位于根目录中。即使没有更改,此makefile仍会继续编译(不是最新的)。我是否缺少此makefile文件?
all:
make a b
a: ./src/a.cpp
g++ -o ./bin/a ./src/a.cpp
b: ./src/b.cpp
g++ -o ./bin/b ./src/b.cpp
Run Code Online (Sandbox Code Playgroud)