我正在尝试编译此工具.下面是Makefile的开头:
CC = gcc
CFLAGS = -Wall -O2 -D TRACES
DFLAGS = -g -Wall -o0
CPPFLAGS= $(INCLUDES:%=-I %)
LDFLAGS = $(LIBRARIES:%=-L %)
LDLIBS = $(USED_TOOLS:%=-l%)
MY_FILES =
INCLUDE_DIR = ~/include
TOOLBOX_INC = $(INCLUDE_DIR)/tools
TOOLBOX_LIB = $(TOOLBOX_INC)
USED_TOOLS = std_io stringutils
INCLUDES = $(TOOLBOX_INC)
LIBRARIES = $(TOOLBOX_LIB)
Run Code Online (Sandbox Code Playgroud)
我还有〜/ include/tools,编译后包括std_io.o,libstd_io.a,stringutils.o和libstringutils.a
我收到以下错误:
gcc -L ~/include/tools rank.o counterexample.o -lstd_io -lstringutils -o rank
ld: library not found for -lstd_io
collect2: ld returned 1 exit status
make: *** [rank] Error 1
Run Code Online (Sandbox Code Playgroud)
我不确定是否包含正确的内容,以及为什么找不到库文件.
编辑:结果我不小心在-L和-I选项之间留下了空格.此外,我想这些路径必须扩展.它现在正在工作,谢谢!
我有一个makefile,它定义了一些目标是foreach函数的规则.
$(foreach var,$(list), $($(var)_stuff) $($(var)_more_stuff)):
@echo Building $@ from $^...
$(CC) $(FLAGS) ...
Run Code Online (Sandbox Code Playgroud)
有没有办法让make在遇到错误时退出而不通过整个列表.
我在C++项目中有一个makefile(编译器:C++ 11).在使用makefile命令删除特定文件之前,如何检查特定文件是否存在?
这是代码:
bin: charstack.h error.h
g++ -Wall -std=c++11 main.cpp charstack.cpp error.cpp -o bin
run:
./bin.exe
clean:
rm bin.exe
# This statement removes auto generated backups on my system.
cl:
rm charstack.h~ charstack.cpp~ main.cpp~ makefile~ error.h~ error.cpp~
Run Code Online (Sandbox Code Playgroud)
如何在用户通过之前检查自动生成的.~backup文件是否存在,然后再尝试删除它们
make cl
Run Code Online (Sandbox Code Playgroud)
在命令行?这里的目标是避免在运行"make cl"时将这些错误输出到终端:
rm: cannot remove `charstack.h~': No such file or directory
rm: cannot remove `charstack.cpp~': No such file or directory
rm: cannot remove `main.cpp~': No such file or directory
rm: cannot remove `error.h~': No such file or directory
rm: cannot …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行一些使用的代码make.我已经在我的64位Windows 7机器上下载并安装了MinGW(标准32位)和MinDM的TDM-GCC风格.
当我在管理员模式下运行make(即mingw32-make.exe)时,我收到以下错误消息:
Windows无法访问指定的路径或文件.您可能没有相应的权限来访问该项目.
奇怪/可怕的部分是,在运行时,它会立即删除exe文件.
我使用Microsoft(R)File Checksum Integrity Verifier V2.05按照评论中的建议运行了校验和SHA1:
C:\path\to\folder>fciv.exe -sha1 mingw32-make.exe
//
// File Checksum Integrity Verifier version 2.05.
//
c8ae5c780ab7bed652883d6443b5bfe5e23d30c9 mingw32-make.exe
Run Code Online (Sandbox Code Playgroud)
我不明白这个输出意味着什么,但也许它对某人有帮助.
笔记:
make程序(其他如gfortran,gcc似乎工作正常)make,我已经通过Run as Administrator在上下文菜单中选择启动了命令提示符.make选择Run as Administrator何时选择它.mingw32-make发生此行为时运行该命令.我也尝试将它重命名为类似的结果make并foo使用相同的结果.有没有办法让软件构建/编译更快?我们有一个构建树c,c ++使用makefile,接近2小时进行新构建.我遇到过几个商业解决方案,比如ElectricAccelerator,Sparkbuild,有没有相应的开源资源?
$(error ...)如果不满足某些先决条件,我想用来中止我的制作过程.在fails_to_work失败时,目标应该退出test -d /foobar.
BAD.mk
all: this_works fails_to_work
this_works:
@echo echo works...
@test -d ~ || echo ~ is not a directory
@test -d /foobar || echo /foobar is not a directory
fails_to_work:
@echo error does not work...
@test -d ~ || $(error ~ is not a directory)
@test -d /foobar || $(error /foobar is not a directory)
Run Code Online (Sandbox Code Playgroud)
$ make -f BAD.mk
echo works...
/foobar is not a directory
BAD.mk:9: *** ~ is not a …Run Code Online (Sandbox Code Playgroud) 似乎GNU make解释的basename函数与bash的basename不同.前者剥去后缀,而后者也剥离路径.如何在makefile中获取文件夹的基本名称?
另外,为什么他们改变了呢?(我花了20分钟才找到错误的来源)
我正在使用GNU Make来构建一个很多人都会使用的C/C++项目.makefile尝试通用,因为此项目中有许多可选文件,每个用户通过MATLAB接口选择这些文件,然后通过命令行参数提供给makefile(make target OPTS ='XYZ'等...).
当我使用makefile时,它正确识别正确的对象依赖项,然后继续查找这些对象的源先决条件并构建它们.但是,每次尝试执行对象规则时,我都会在gcc调用之后收到错误消息"Abort trap:6".
Makefile如下
vpath %.c $(PATH) $(OBJ_DIR)
# Pick compilers
CC1=g++
CC2=gcc
LNK=g++
# Assign variables for c/cpp implicit rules
CXXFLAGS= $(CCFLAGS) $(DEFINES) $(INCLUDES)
CFLAGS = $(CCFLAGS) $(DEFINES) $(INCLUDES)
# Assign various user-defined values
OUTPUT = -o $(USER_LIB)
C_OBJECTS = $(patsubst %.c,$(OBJ_DIR)/%.o,$(C_SOURCES))
CPP_OBJECTS = $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(CPP_SOURCES))
OBJECTS = $(C_OBJECTS) $(CPP_OBJECTS) $(SIM_OBJECTS)
# User Library Dependencies and Compilation Rules
$(USER_LIB): $(OBJECTS)
$(LNK) $(LINKERFLAGS) $(CCFLAGS) $(DEFINES) $(INCLUDES) $(OUTPUT) $(OBJECTS)
$(OBJ_DIR)/%.o: %.c
$(CC2) $(CFLAGS) -c -o $@ $< …Run Code Online (Sandbox Code Playgroud) 以下是关于辅助扩展的GNU Make手册部分的示例(略微简化):
foo_SRCS := bar.c baz.c
.SECONDEXPANSION:
# $$@ expands to the target ("foo" in this case)
foo: $$(patsubst %.c,%.o,$$($$@_SRCS))
Run Code Online (Sandbox Code Playgroud)
这很好用; 它构建bar.o和baz.o:
cc -c -o bar.o bar.c
cc -c -o baz.o baz.c
Run Code Online (Sandbox Code Playgroud)
但是,如果我只略微调整这个例子,patsubst停止工作:
all: foo.a
foo_SRCS := bar.c baz.c
.SECONDEXPANSION:
# $$* expands to the stem of the match ("foo" in this case).
%.a: $$(patsubst %.c,%.o,$$($$*_SRCS))
ar rcs $@ $^
Run Code Online (Sandbox Code Playgroud)
它不再建造bar.o和baz.o,而是使用*.c直接文件作为先决条件!
ar rcs foo.a …Run Code Online (Sandbox Code Playgroud) 我的makefile文件中包含以下内容。其为GNUmakefile,因此支持其他制造功能:
# Undefined Behavior Sanitzier (Clang and G++)
ifeq ($(findstring ubsan,$(MAKECMDGOALS)),ubsan)
CXXFLAGS += -fsanitize=undefined
MAKECMDGOALS := $(subst ubsan,,$(MAKECMDGOALS))
endif # UBsan
Run Code Online (Sandbox Code Playgroud)
运行它会导致:
make ubsan
make: *** No rule to make target 'ubsan'. Stop.
Run Code Online (Sandbox Code Playgroud)
我知道代码路径正在执行中(通过在块中引入错误)。如何从命令目标中删除目标?