我经常在几台不同的计算机和几种不同的操作系统上工作,它们是MacOSX、Linux或Solaris。对于我正在进行的项目,我从远程git存储库中提取代码
无论我在哪个终端,我都希望能够完成我的项目。到目前为止,我已经找到了通过每次切换计算机时更改makefile来绕过操作系统更改的方法。然而,这是乏味的,并导致了一大堆头痛
如何修改makefile,使其检测到我正在使用的操作系统并相应地修改语法
以下是生成文件:
cc = gcc -g
CC = g++ -g
yacc=$(YACC)
lex=
我被困在这里了。我们有两个makefile(这是我无法更改的要求)
defs.mk:它包含源文件名及其额外的编译标志(标准标志除外),例如:
但这不起作用,因为条件中不支持自动变量的扩展。还有其他方法吗?我通常利用:
或用于定义我自己的函数:
debug_defs=$(if $(findstring $(1),file1 file2),-DDEBUG,-DNDEBUG)
%.o: src/$$(notdir %).c
@cc -c $(CFLAGS) $(call debug_de
标签: Makefile
gnuautotoolsautoconfautomake
我的目标是将所有对象文件构建在.objs目录中,而不是生成文件的根目录中,并将二进制文件(和库)复制到项目的bin/目录中。但我一直无法找到任何资源来解释如何做到这一点。我该怎么做呢
这是我的configure.ac和src/Makefile.am-我有两个被引用的共享库的类似Makefile.am文件。它们进行编译,并在将它们复制到bin/目录后按它们应该的方式工作。我只是想让这个过程自动化
配置.ac
AC_PREREQ([2.63])
AC_INIT([gtkworkbook], [0.1
考虑下面的Makefile
COMP = compiler
OBJECTS = file1 \
file2 \
file3 \
file4 \
file5_suffix \
file6 \
file7 \
file8 \
file9_suffix \
file10
all: $(OBJECTS)
$(COMP) $(OBJ
我正在编写一个主makefile来编译和安装多个相互依赖的基于autoconf的库。一切都很好,第一次去。问题是:如果我单独处理其中一个库并执行“make&&make install”,前缀文件夹中的头文件将被覆盖(即使它们未被触及)。这会导致所有依赖库从头开始编译
有没有一种方法可以避免不必要的重新编译而不侵入makefile 您可以使用仅存在的sentinel文件来建立依赖关系图。例如
prefix := /usr/local
.PHONY: all
all: libx-built
li
我有svn,我有gcc,我有make。下载和编译所有wxWidgets示例的最简单的命令行方式是什么?嗯。。。在这种情况下,谷歌可能应该成为我的第一选择,而不是第一选择 wxiwdget有很多关于如何使用不同编译器构建东西的优秀文档。别错过了
还有维基
这是我前面问题的后续:因为建议的解决方案打破了依赖关系,使得makefile变得无用。我不明白为什么
我正在使用gnu make 3.82
如果已创建obj目录,我有一条规则可以使用:
objdir:=../obj
$(objdir)/%.o: %.C
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/
我当前在Makefile中有以下规则:
../obj/%.o: %.cpp
mkdir -p ../obj/$<
$(CXX) $(CXXFLAGS) $(INCLUDES) $(LIBS) -c $< -o $@
rmdir ../obj/$<
很明显,我已经侵入make,在../obj下构建了所需的文件夹。有没有一种方法可以让我使用PASSUT,这样我就可以用$$的值来定义MKDIR,不包括文件名?< /P> < P>
我有一大块makefile(~50行),需要针对不同的情况(使用不同的库)复制粘贴5次。是否可以在makefile中创建一个函数并调用该函数而不是复制粘贴
这是我尝试过的一个例子。基本上,这会尝试为已安装的库找到正确的路径
define Flags_template
$(1)_include_home := $(HOME)/usr/include
$(1)_include_home_name := $(HOME)/usr/include/$(1)
ifneq ($$(wildcard
我想将Tk静态链接到我的代码中。由于依赖关系,我遇到了麻烦。我对Makefile所做的修改是:
TK_LIBS_64 = \
-L/usr/X11R6/lib64 \
-lX11 \
-lXss \
-lXext \
-L/usr/X11R6/lib64 \
-lXft \
-lX11 \
-lfontconfig \
-lfreetype \
-lxmlparse \
-lexpat \
-L/us
我得到了一个如下所示的Makefile:
.PHONY: all
all: aaa.2 bbb.2
aaa.2 : aaa.1 common.1
create_2 $@
bbb.2 : bbb.1 common.1
create_2 $@
程序create_2需要很长的启动时间,但是可以一次创建几个%.2文件,因此我只想调用create_2一次
例如,如果common.1已更改,我希望调用create_2 aaa.2 bbb.2,而不是create_2 aaa.2和cre
对于我面临的一个问题,我有两个问题
对于使用gcc的项目,我们采用了非递归方法。接下来,我们希望将其用于其他一些交叉编译器,例如不支持依赖项生成的-MM/MD选项的微芯片C18
我不想使用makedepend,因为它非常旧,并且在makefile中添加了依赖项;此外,我相信用makedepend将对象与源分离是很困难的
最后,我的问题是:
是否有现成的C/C++依赖项生成器(类似于-MM
/-MD选项)?(Windows和Linux都需要生成支持。)
我可以使用gcc仅生成依赖项文件并进行实际编
下面是一个人为的示例Makefile,说明了我遇到的一个问题
release: TYPE := release
FILE = main.cpp
OBJDIR = dist/$(TYPE)
OBJS = $(patsubst %.cpp,$(OBJDIR)/%.o,$(FILE))
release: $(OBJS)
@echo "just created: " $(OBJS)
%.o:
@echo "create $@"
当我运行“make release”时,输出为:
cr
我正在尝试在二进制文件中指定rpath。
我的makefile看起来像这样-
CC=gcc
CFLAGS=-Wall
LDFLAGS= -rpath='../libs/'
main: main.c
gcc -o main main.c
clean:
rm -f main main.o
但是,当我使用命令readelf-a./main | grep rpath查询rpath时,我什么也得不到
我已经尝试将rpath指定为LDFLAGS=“-rpath=../libs/”
我有许多标记文本格式的文本文件,我想使用gnumake生成HTML输出。我有一个Makefile,它只能使用一个文件:
MARKDOWN=markdown2
all: my_article_1242323266.html
%.html: %.markdown
$(MARKDOWN) $< $@
clean:
rm -f *html
MARKDOWN=markdown2
全部:my_article_1242323266.html
%.html:%.markdown
$
我想使用单个Makefile在数百个子目录中生成目标。每个子目录都是一个日期/时间戳,如下所示:20120119\u 153957,它与以下模式匹配。没有与此模式匹配的其他子目录
我想生成的一个目标名为????????/graph.pdf。我有一个名为make_graph的脚本,它将根据子目录名生成图形。但我不知道如何编写一个Makefile,它将自动全局化所有子目录并以编程方式生成这些目标
例如,code子目录:=??????????????似乎正确地覆盖了所有子目录。我可以检查一下这个规则:
我试图弄清楚.mk文件中的以下两行是什么意思
包括$(ROOTDIRECT)/target/$(MYSUBDIR)/defs.mk
包括$(ROOTDIRECT)/target/$(dir$(patsubst%/,%,$(MYSUBDIR)))/defs.mk
为了清楚起见,让ROOTDIRECT为“/home/me”,MYSUBDIR为“platform”
我猜第一行是直截了当的,包括“/home/me/target/platform/defs.mk”
第二行我不理解,我从我的环境中猜测它包括
使用Makefile,我试图让我所有的对象和二进制文件都放在发布目录中。似乎我尝试过的每个置换都有一些错误,所以我请求一些帮助。这是我所拥有的,我需要知道如何改变它。谢谢
BUILDDIR = Release
CXXFLAGS = -O2 -g -Wall -fmessage-length=0
LDFLAGS=
HEADERS = $(wildcard *.h)
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
LIBS
我想使用此处介绍的自动依赖关系管理技巧,对*.[cpp,h]文件进行平面布局:
我的工作是:
.PHONY: all clean
CXX ?= g++
DEBUG ?= "1"
ifeq ($(DEBUG), "1")
CFLAGS+=-g
endif
BODIES := ExecuteStart GraphNode IdNodeMap IdValuePairCollection IScenarioReader XMLScenarioReader INodeExecute
SRCS
(这类似于但略有不同)
当我试图强制构建目标时,make会自动认为该目标已过时,并强制运行依赖它的所有目标
在我的例子中,目标是一个递归的make调用,它做了大量的工作,可能只是返回“无需完成”:
在这种情况下,“makeall”运行40秒,尽管intermediate.dat可能没有更改(递归make返回“无需执行任何操作”)。但是,如果递归make updated intermediate.dat,则目标应已过期
真的没有办法吗
问候
divB使中间。dat依赖于虚假目标,而不是虚假本身
我有一段代码,其中包含一些mpi api相关位:
#if MPIVERSION==1
...
#elif MPIVERSION==2
...
#endif
在假设MPI-1和MPI-2之间切换
有没有一个好的方法来推断一个好的版本——特别是一个可能在构建系统中出现的版本
谢谢 如果需要,使用MPI\u版本以及MPI\u SUBVERSION(即MPI 1.2是MPI\u版本=1和
MPI\u SUBVERSION=2)。文档执行配置脚本通常执行的操作-尝试编译并运行一个非常简单的测试MPI代码
我是新来做文件的,我把这个和一些尝试和错误结合起来。这个代码是用来编译我的C++程序的。
My main.cpp文件与makefile位于同一文件夹中。我有一个lib/文件夹,其中包含主要依赖的标题
下面的makefile生成了正确完整的代码编译。但我希望我能找到遗留下来的*.o对象。(请注意,我已经尝试使用和不使用“clean”规则进行了两次修改,两次都得到了相同的结果。)
另外,如果有必要,我在MacOSX上,我的程序是用xcode设计的。(我知道xcode有自己的构建流程,但我正在为lin
我的计算机上有多个make.exe。如何指定用于生成代码的代码?
我可以将一个(make.exe)复制到我的代码文件夹中,然后运行:
make-f Makefile*
谢谢。如果您只打算使用make.exe中的一个,请设置PATH环境变量,使其指向您要使用的环境变量
如果计划对不同的项目使用不同的make.exe,请将.BAT文件添加到项目目录中,并使用其中make.exe的完整路径
bat文件示例:
@echo off
c:\somepath\somewhere\make.exe %*
像这
我正试图编译一段名为DLPOLY(支持多核处理)的科学代码。关于如何做到这一点的在线说明似乎已经过时,makefile只包含大型计算集群的示例,而不包括家用计算机
说明如下:
通用目标模板
未知平台:
$(MAKE) LD="path to FORTRAN90 Linker-loaDer" \
LDFLAGS="appropriate flags for LD (MPI libraries)" \
FC="path to FORTRAN90 compiler" \
我正在做一个新项目,它依赖于另外两个项目(由其他人编写)。在开发代码时,我希望使用g++选项,例如-Wall-pedantic-Werror,但当我使用这些选项时,我会收到大量警告,包括来自其他两个项目的文件
是否有任何方法可以忽略这两个项目中的警告,但仍然可以看到我自己项目中的警告?如果您通过makefile直接编译它们的源代码,则可以制作可选的CPPFLAGS,用于条件编译参数。例如:
CPPFLAGS=-Wall-pedantic-Werror用于项目,而CPPFLAGS=-g用于项目文件
在生成文件中使用此选项时:
run: mydir/*
do_something.sh
每次添加/更改mydir中的文件时,它都会触发do_something.sh。当mydir目录树(即任何子目录或子目录的子目录等)中的任何文件更改或添加时,是否也可能触发do_something.sh?这可能会起作用
run: $(shell find mydir/ -type f)
do_something.sh
run不能是虚假目标,即它应该在配方执行结束时创建一个名为run的文件
如
我不熟悉使用libtool。然而,这个问题似乎很奇怪。一切都在那里,但libtool说“libtool:link:'cuda_transfer.lo'不是有效的libtool对象”。但是,生成此lo文件的规则就在Makefile中。除此之外,这两个头文件也正好在它们应该在的位置,并且可以工作。你知道哪里出了问题吗
cuda_transfer.lo: particles_cuda.h ../../include/psc_particles_cuda.h
接下来是Makefile中出现cuda_t
我有一个项目,对10个不同的文件进行相同的分析。例如,我从test1.txt开始test10.txt。它们分别设置在10个不同的文件夹中,名为test1测试10。我有一个python脚本,它在文件上运行一些测试并生成test1\u v1.txt…test10\u v1.txt,然后使用Rscript进行另一轮分析并生成test1\u v12.txt…test10\u v2.txt。现在我有一个makefile设置,如下所示:
TEST_FOLDER=test1 test2 test3 test4
我正在安装blender 2.69以与MORSE一起使用,但在键入“make install”时出现此错误:
请找人帮忙?权限问题?磁盘已满?什么都没有,我用过sudo,磁盘容量超过70gb。您是否先在没有sudo的情况下进行make,然后进行sudo make安装?sudo这是我的问题,我已经卖掉了它,但现在我遇到了其他错误。*添加到PYTHONPATH和MORSE_资源_路径。*在环境中使用默认场景。*morse 1.2-10-gf0bcf连接失败:没有此类文件或目录morse.actuat
目录中有C文件,我有一个makefile。
我通常使用makefile来编译。
我一直在徘徊在“澄清”这个角色上
“清除”只是删除文件。
虽然我没有用“弄干净”,但不是吗
当出现问题时,他就会出现错误和警告。
我不明白为什么每次更改源文件时都需要使用“make clean”。这只是惯例。按照惯例,clean会将您返回到一种状态,在这种状态下,您只有“源”文件。换句话说,它摆脱了所有可以从其他东西(对象、可执行文件、列表等等)构建的东西
所以makeclean;make预计将从头开始构建一切。事实
假设我的主目录中有以下文件结构
.
|-- foo
| `-- lib
| |-- bar.cpp
| `-- bar.h
|-- baz
| |-- qux.cpp
| `-- qux.h
|-- projects
| `-- src
| |-- makefile
` `-- main.cpp
那main.cpp看起来像
#include "bar.h"
#include "qux.h"
// does stuff
我的mak
标签: Makefile
relative-pathabsolute-pathmsys
为了将相对路径转换为绝对路径,我使用了relpath/abspath命令。
但是,结果将提供一个带有根目录的路径,而不带冒号:
例如:
“/c/Users/MyName/Project/SVN/ACC/PCC/HAL/code/include”
我需要c:/Users/MyName/Project/SVN/ACC/PCC/HAL/code/include,以便我的代码可以找到头文件
我正在使用MSYS 1.0的make
有什么办法可以得到这个结果吗
winpath_helper=$1:/$(su
我正在阅读make手册,最后我读到了这一段:
下面是我们如何编写清理示例的make规则
编辑:
clean:
rm edit $(objects)
在实践中,我们可能希望以一种更简单的方式编写规则
处理意外情况的复杂方式。我们会的
这:
这可以防止make被一个名为
清除并使其在rm出错的情况下继续。(见虚假
目标和配方中的错误。)
我知道,cleantarget并没有引用文件系统上的文件,但是如果我省略了目标上的.PHONY声明(该声明应该声明为.PHONY),那我怎么会感到困惑呢
我有以下生成文件:
all: xmltest
xmltest: xmltest.cpp tinyxml2.cpp tinyxml2.h
这工作正常-在执行后,生成所有可执行文件“xmltest”
但是,我想将编译器切换到clang++。因此,我在文件的开头添加了这一行:
CXX=clang++
现在执行make all会产生一个错误:
clang++ xmltest.cpp tinyxml2.cpp tinyxml2.h -o xmltest
clang++.exe: warni
我正在为一个大型代码库设置自动工具,这个代码库曾经只是一个bash脚本编译,后来只是手工编写的makefile
我们有一组需要关闭编译器优化的文件。这些文件已经在它们自己的子目录中,因此它们将拥有自己的Makefile.am
删除任何现有的编译器优化并强制在编译器上为这些特定文件设置一个-O0标志的正确方法是什么?您不必删除现有的优化:将使用编译器调用的-O的最后一个值,因此只需在最后添加-O0
automake不直接支持这一点,但在文档中有定义
否则,如果您知道您将只使用gnumake调用您的
在我的Makefile中,我希望在执行目标时为变量赋值:
var=`find dir_name -name "file_name"`
我该怎么做?当我把作业放在目标中时,它不起作用。请给我们完整的目标(包括变量用法)。该目标本身使用变量还是先决条件使用它?在mytarget下,我使用find命令搜索文件位置。我想收集变量var中的文件路径。目标本身使用变量所以这不是make变量?这是一个shell变量?那么您的问题是每一行都在它自己的shell中运行。如果要从一行到另一行使用变量,则需要在sh
我进行了RPM打包,并通过rpmbuild-ba***.spec获得了RPM文件和src.RPM文件
但是,当我键入rpm-qi***.rpm时。计算机屏幕显示rpm包的大小为零。另外,当我键入rpm-qa | grep***(rpm文件名)等时,没有问题。怎么搞的?规范文件有问题吗
这是我的规范文件------------------------------------------
Summary : Spec file for making RPM file for ****!
Name :
我有一个关于makefile的问题(这里不是说LinuxShell或bash)。在make文件中分号和双代号有什么区别
在第一台计算机上,以下功能起作用:
cd code; ant clean compile jar run
在第二台计算机上,上述功能不起作用,而以下功能起作用:
cd code && ant clean compile jar run
上面的代码位于名为“makefile”的文件中。我想知道“&&”和“;”之间的区别
谢谢
注:
第二台计算机上分号的错误消息
标签: Makefile
pattern-matchinggnu-makemanpage
我正在尝试使用make在我的项目中自动构建man页面
我有以下目录结构:
my_project
man/
man1/
man3/
man5/
man7/
在每个目录中,都有一个或多个.md文件
我想在更新相应的man/man{1,3,5,7}/*.md时生成*.1,*.3,…,页面
myMakefile的相关部分包括:
MY_DOC := $(wildcard $(MY_PROJECT)/man/*/*.md)
all: $(MY_
我有makefile.am。我想在不使用automake文件中的“make clean”的情况下清理文件
在生成.la、.a、.so文件后,将生成文件。我想删除所有文件。如果我运行makeclean,那么这些将被删除。
但是,我需要在制作结束时将其移除
makefile.am:
libdir=${prefix}/lib/cli
lib_LTLIBRARIES= libmain.la
libmain_la_SOURCES = main.c
clean-local:
我正在使用make从LaTeX源代码构建PDF,如下所示:
PDF:=lualatex --output-directory=../pdf
TITLE:="report"
.PHONY: pdf
pdf: ./src/report.tex
cd ./src && $(PDF) report.tex $(TITLE).pdf
cd ./src && $(PDF) report.tex $(TITLE).pdf
clean:
rm -rf
我正在为我的项目编写makefile,结构是
.
├── file
│ ├── include
│ │ └── FileIO.hpp
│ └── src
│ └── FileIO.cpp
├── main
├── main.cpp
├── makefile
├── ui
│ ├── include
│ │ ├── KeyValues.hpp
│ │ ├── MAP.hpp
│ │ ├── NotifyMessageVo.hpp
│ │
当我尝试将其输入makefile时,出现以下错误:
使TARGET=cooja干净
../../../platform/cooja/Makefile.cooja:74:**缺少分隔符(您是指制表符而不是8个空格?)。停止
进程返回错误代码2
我对这一行有问题:
gcc-I/usr/lib/jvm/jdk1.8.0_121/include/jni.h
根据其他职位的指示,我遵循以下指示:
解决问题
您可以通过将空格更改为实际制表符来解决此问题。我用vim来修复我的文件。只需打开它:
###
基于并改编自,并假设您的所有源文件都是.cpp,您可以很容易地得到这样一个解决方案来自动生成依赖关系:
SRCS := $(wildcard *.cpp */*.cpp)
DEPDIR := .d
DEPS := $(SRCS:%.cpp=$(DEPDIR)/%.d)
# Temporary .Td dependence file... ?
DEPFLAGS = -MT $@ -MD -MP -MF $(DEPDIR)/$*.Td
# Isn't it better a order-onl
我有一些工具可以为我创建一个平台。我有一个目标,它依赖于这些生成的源。此目标必须是泛型的(泛型意味着,它使用一个模式:.build\u bsp%)-这样我就不能使用$(shell find…)
因此,当平台提前创建时,一切正常:
$ make platform
mkdir -p platform/a53/AFS/bsp/
touch platform/a53/AFS/bsp/generated.c
mkdir -p platform/r5/MMO/bsp/
touch platform/r5/M
如何使用makefile并使用clang编译C/C++项目到LLVMbytecode(.bc文件)?wllvm或gllvm()wllvm或gllvm()
我正在尝试安装最新版本的glib版本2.64.3库,它使用meson构建系统来编译glib代码
在安装glib时,我试图为编译器提供自定义选项,以便使用特定的gcc版本进行编译…等等
这是我的命令:-
/test/common/pkgs/python/v3.6.1/bin/meson setup glib_install -Dbuild.cpp_args="-fPIC" -Dbuild.c_args='-fPIC -O2' -Dc_link_args='/test/common/pkgs/gc
通过几个级别的makefile传递和修改环境变量的正确方法是什么?具体来说,我正在使用在父makefile中设置LDFLAGS,并且我需要在一些子makefiles中添加变量。链接器需要文本字符串$ORIGIN,该字符串不是要展开的另一个变量
Makefile:
#所有子项的默认值
导出LDFLAGS=-Wl,-rpath='$$ORIGIN'
全部:
环境| grep LDFLAGS
$(MAKE)-f child1.mk
$(MAKE)-f child2.mk
child1.mk:
#添加
事情是这样的。我的目录中有以下文件和文件夹:
src/ obj/ include/ bin/ Makefile
按照惯例,在我的src/目录中,我有我的.cpp文件,在我的include/目录中,我有我的.hpp文件。在这些目录中没有其他子目录——因此,对于所有密集的目的来说,这是一个相当简单的项目
我的问题很简单。在这种情况下,创建Makefile的最佳方法是什么?更具体地说,这样做的好方法是什么?以前我有一个Makefile,但当我只更改.hpp头中的某些内容时,它没有重新编译所需的文件
我遇到了一个奇怪的行为,addprefix使用-e。未添加第一个单词所需的-e。下面是复制它的makefile
a := file1 file2 file3
b := $(addprefix -s , $(a))
c := $(addprefix -e , $(a))
all:
@echo $(b)
@echo $(c)
结果:
-s file1 -s file2 -s file3
file1 -e file2 -e file3
这是一个错误还是缺少什么?您不应该使用echo
1 2 3 4 5 6 ...
下一页 最后一页 共 89 页