标签: gnu-make

找不到指向Makefile的库文件

我正在尝试编译此工具.下面是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选项之间留下了空格.此外,我想这些路径必须扩展.它现在正在工作,谢谢!

c makefile gnu-make

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

当makefile规则的目标是foreach函数时停止错误

我有一个makefile,它定义了一些目标是foreach函数的规则.

$(foreach var,$(list), $($(var)_stuff) $($(var)_more_stuff)):
    @echo Building $@ from $^...
    $(CC) $(FLAGS) ...
Run Code Online (Sandbox Code Playgroud)

有没有办法让make在遇到错误时退出而不通过整个列表.

makefile gnu-make

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

在makefile中删除文件之前检查文件是否存在

我在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)

makefile gnu-make

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

Windows在运行时删除make可执行文件.为什么?

我正在尝试运行一些使用的代码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)

我不明白这个输出意味着什么,但也许它对某人有帮助.

笔记:

  1. 无论文件位于我的电脑上,都会发生这种情况.
  2. 此行为是特定于该make程序(其他如gfortran,gcc似乎工作正常)
  3. 重命名文件没有区别.
  4. 我是电脑的管理员
  5. 从资源管理器或命令行运行程序时的行为相同.
  6. 我的防病毒程序(Avast)在扫描时没有检测到文件的任何问题.
  7. 我从这个SourceForge页面获得了MinGW安装文件.
  8. 我从这个页面获得了TDM-GCC Web安装程序.
  9. 文件大小为219,662字节(来自主MinGW和TDM-GCC包)
  10. 我已经从命令行运行make,我已经通过Run as Administrator在上下文菜单中选择启动了命令提示符.
  11. 我也尝试make选择Run as Administrator何时选择它.
  12. mingw32-make发生此行为时运行该命令.我也尝试将它重命名为类似的结果makefoo使用相同的结果.
  13. MinGW第一次发生这种情况时,它删除了原始文件,并使用该 …

windows makefile gnu-make

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

提高构建速度的提示

有没有办法让软件构建/编译更快?我们有一个构建树c,c ++使用makefile,接近2小时进行新构建.我遇到过几个商业解决方案,比如ElectricAccelerator,Sparkbuild,有没有相应的开源资源?

makefile build gnu-make

8
推荐指数
3
解决办法
5711
查看次数

如何让$(错误...)在GNU Make中有条件地工作?

$(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)

makefile gnu-make

8
推荐指数
2
解决办法
6853
查看次数

获取GNU make中文件夹的基本名称

似乎GNU make解释的basename函数与bash的basename不同.前者剥去后缀,而后者也剥离路径.如何在makefile中获取文件夹的基本名称?

另外,为什么他们改变了呢?(我花了20分钟才找到错误的来源)

makefile gnu-make

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

GNU在gcc调用后生成"Abort trap:6"但是单独执行时调用有效

我正在使用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)

c makefile gnu-make

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

为什么patsubst在使用$$*的二次扩展时会停止工作?

以下是关于辅助扩展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.obaz.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.obaz.o,而是使用*.c直接文件作为先决条件!

ar rcs foo.a …
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

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

从MAKECMDGOALS中删除目标?

我的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)

我知道代码路径正在执行中(通过在块中引入错误)。如何从命令目标中删除目标?

makefile gnu-make

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

标签 统计

gnu-make ×10

makefile ×10

c ×2

build ×1

windows ×1