我正在分发我的cpp文件和makefile.现在,makefile与cpp文件位于同一目录中.
makefile中的变量(如果有的话)是什么允许我检索makefile所在的当前目录?通过这种方式,我可以使用该变量来指定我的cpp路径进行编译.
我的makefile如下:
all:
g++ ($makeFileDir)/main.cpp ($makeFileDir)/hello.cpp ($makeFileDir)/factorial.cpp -o ($makeFileDir)/hello.exe
Run Code Online (Sandbox Code Playgroud)
编辑:我正在Windows上运行我的makefile
我记得我有同样的问题.据我所知,这是不可能的.你可以拥有的最好的选择是将其作为变量传递.这是跨平台的并且保证可以正常工作,因为您在调用时知道makefile目录(否则您无法调用它).
或者,你可以做一个非常脏的技巧,这意味着你试图将你当前的路径(你可以用gnu make中的$(CURDIR)获得)与makefile的调用路径(这可能很棘手,并依赖于你的作品)
这是获取 Makefile 目录的跨平台方法,它应该完全与 shell 无关。
makeFileDir := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
Run Code Online (Sandbox Code Playgroud)
请注意,这将为您提供当前正在解释的 Makefile的目录。如果您使用其他人的此语句包含一个 Malefile,您可能会遇到不好的(或好的!)惊喜。
如果您使用 make for windows 的最新实现(即Chocolatey 的.
根据您在 Windows 上使用的 make 版本,反斜杠的处理可能会不一致。您可能需要以下变体之一。例如,GnuWin 的 make 3.81 二进制文件就是这种情况。
\和/即可获得相反的行为。根据我的经验(使用 GnuWin 的 make),您可能必须使用正斜杠才能将此类变量用于 makeinclude语句或在VPATH. 但是您当然需要在 DOS shell 中使用反斜杠,因此在配方中...您可能需要该变量的两个版本,但至少替换可以确保路径分隔符是一致的!makeFileDir := $(subst \,/,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
Run Code Online (Sandbox Code Playgroud)
abspath已损坏,无法处理包含驱动器号的路径。这里还有一个处理 Windows 绝对路径(带驱动器号)的解决方法。然后,您可以使用它来获取 Makefile 的目录(此处也包含路径分隔符替换)。我不会解释细节,但如果该参数已经是 Windows 绝对路径(即:路径的根目录中存在),则解决方法只是返回参数,abspath否则使用内置函数。define fixabspath
$(if $(findstring :,$(firstword $(subst /, ,$(subst \,/,$(1))))),$\$
$(1),$\
$(abspath $(1)))
makeFileDir := $(subst \,/,$(dir $(call fixabspath,$(lastword $(MAKEFILE_LIST)))))
Run Code Online (Sandbox Code Playgroud)
评论
fixabspath定义中,$\只是为了可读性而分割行。MAKEFILE_LIST变量包含正在解释的 Makefile 列表,最后一个是当前的。请参阅相应的手册页。| 归档时间: |
|
| 查看次数: |
7146 次 |
| 最近记录: |