我试图描述我的代码,因为我无法弄清楚是什么减慢了它.我有以下makefile:
CXX=gcc
RM=rm -f
CFLAGS=-pg -DNDEBUG -O3 -g3 -O0 -D_FILE_OFFSET_BITS=64
LDFLAGS=-pg -lpthread `pkg-config fuse --cflags --libs`
EXEC = fs
SRCS=$(shell echo *.c)
OBJS=$(subst .c,.o,$(SRCS))
all: $(EXEC)
$(EXEC): $(OBJS)
$(CXX) $(LDFLAGS) -o $(EXEC) $(OBJS)
%.o: %.c
$(CXX) $(CFLAGS) -c -o $@ $^
clean:
$(RM) *.o
$(RM) $(EXEC)
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
gcc -pg -DNDEBUG -O3 -g3 -O0 -D_FILE_OFFSET_BITS=64 -c -o datablock.o datablock.c
gcc -pg -DNDEBUG -O3 -g3 -O0 -D_FILE_OFFSET_BITS=64 -c -o disk.o disk.c
gcc -pg -DNDEBUG -O3 -g3 -O0 -D_FILE_OFFSET_BITS=64 -c -o fsinterface.o fsinterface.c …Run Code Online (Sandbox Code Playgroud) 像这样的命令将起作用:
(LD) $(LDFLAGS) -o reip.app newlib/crt0.o reip.o renetif.o fs.o httpd.o liblwip.a newlib/libc.a
Run Code Online (Sandbox Code Playgroud)
但是如果我在*.o文件之前放置*.a - 它将无法从libs中找到函数.
我搜索了一些旧的项目,发现在makefile文件中,如下所示:
$(CC) $(LIBS) -o $(TARGET) JukeboxMain.o JukeboxPlayer.o ...
Run Code Online (Sandbox Code Playgroud)
直到我将$(LIBS)移到行尾才能工作.但我记得很久以前这对我很有用.有人可以回答改变了什么以及为什么它不再起作用了)PS我不喜欢玩编译器,链接器和其他工具 - 我更喜欢创建一些东西;)
我在ac程序中有一个读取头文件路径
#include <lib/a.h>
#include <lib/b.h>
Run Code Online (Sandbox Code Playgroud)
如何在makefile中指定'lib'应该在哪里?它给我一个编译错误,说找不到lib/ah.但我知道啊所在的系统路径.如何告诉我的Makefile去哪里找lib?
谢谢,维克.
我复制粘贴我的代码和我得到的错误.这很奇怪.我已经标记了我遇到错误的所有行.我甚至无法编译课程.
#ifndef MYRECORD_H
#define MYRECORD_H
#include "MyException.h"
#include <map>
using namespace std;
//Error in next line
using std::vector;
class MyRecord {
public:
explicit MyRecord(string& id); // I don't want implicit conversion from std::string to MyRecord!
// Mutator functions - setting of other fields
// In this version, hardly any of the implementations will actually throw exceptions
// later validation functions will be added
void setName(string& aname) throw (MyException);
void setEmail(string& amail) throw (MyException);
void setInfo(string& info) throw (MyException);
void setImage(string& …Run Code Online (Sandbox Code Playgroud) 我正在尝试make使用简单的三个文件.
foo.h中
#ifndef __foo_H_
#define __foo_H_
void print();
#endif
Run Code Online (Sandbox Code Playgroud)
foo.c的
#include <stdio.h>
#include "foo.h"
void print()
{
printf("Hello World !");
}
Run Code Online (Sandbox Code Playgroud)
main.c中
#include "foo.h"
int main()
{
print();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用以下makefile时,一切运行正常
生成文件
CC = gcc
CFLAGS = -I.
DEPS = foo.h
OBJ = foo.o main.o
.PHONY: clean
main: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
clean:
rm *.o
Run Code Online (Sandbox Code Playgroud)
上面的工作是因为make默认运行第一个目标(我基本上到处读取).
如果我使用下面的makefile
CC = gcc
CFLAGS = -I.
DEPS …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个csh脚本,它将在子目录中执行makefile.到目前为止我有这个:
find -maxdepth 2 -name 'Makefile' -print -execdir make \;
我遇到的问题是当我尝试运行它时出现以下错误:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
在这种情况下,我无法合理地更改$ PATH变量.关于变通方法的任何想法.
非常感谢和愉快的编码
我正在使用GNU make和Makefiles.是否可以为一个构建步骤设置环境变量?
目前我正在做这样的事情:
VAR:=valueA
step1:
echo $(VAR)
Run Code Online (Sandbox Code Playgroud)
然后,"make step1"将打印"valueA".
是否有可能为一个构建步骤重新定义env var?
VAR:=valueA
step1:
echo $(VAR)
step2:
VAR:=valueB
echo $(VAR)
Run Code Online (Sandbox Code Playgroud)
我想"make step1"打印"valueA",但是"make step1"打印"valueB".
我正在尝试在Linux中编写一个遍历当前目录的bash脚本,并在每个子目录中启动现有的makefile.它应该适用于每个子目录,无论深度如何.
一些限制:
make只有在此类文件夹中有makefile时,才应启动每个目录的命令.关于如何做的任何想法?
我重新设计Makefile了论文项目的大部分文件,以便正确反映工作流程(为项目子目录中的目标创建依赖项的制定规则).但是,在特定的子目录(prepare)中,即使没有依赖项更改,也make 始终重建所有目标.这种意外行为可能是什么原因?
注意:sf.done是一个真实的文件(类型,我称之为"标记文件"),位于不同的子目录中,并在完成数据收集(import)时创建/更新目标的相关步骤transform.
准备/ Makefile文件:
IMPORT_DIR=../import
prepare: import \
transform \
cleanup \
merge \
sample
import: $(IMPORT_DIR)/sf.done
transform: transform.done
cleanup: cleanup.done
merge: merge.done
sample: sample.done
transform.done: transform.R import
@$(RSCRIPT) $(R_OPTS) $<
@touch $@
cleanup.done: cleanup.R transform
@$(RSCRIPT) $(R_OPTS) $<
@touch $@
merge.done: merge.R cleanup
@$(RSCRIPT) $(R_OPTS) $<
@touch $@
sample.done: sample.R merge
@$(RSCRIPT) $(R_OPTS) $<
@touch $@
.PHONY: import transform cleanup merge …Run Code Online (Sandbox Code Playgroud) 我构建了一个静态库.问题是我无法从我的Makefile链接它
TARGET = AR1020
CC = gcc
CFLAGS = -Wall -std=c99 -I./inc/
LINKER = gcc -o
LFLAGS = -Wall -static -I./inc/
SRCDIR = src
INCDIR = inc
OBJDIR = obj
BINDIR = bin
LIBDIR = ./lib
LIBFLAG = -li2c
SOURCES := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(INCDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm = rm -f
$(BINDIR)/$(TARGET): $(OBJECTS)
@$(LINKER) $@ $(LFLAGS) -L$(LIBDIR) $(LIBFLAG) $(OBJECTS)
@echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
@echo "Compiled "$<" successfully"
.PHONY: …Run Code Online (Sandbox Code Playgroud)