Makefile 关于使文件语法理解的初学者问题

Makefile 关于使文件语法理解的初学者问题,makefile,gnu-make,Makefile,Gnu Make,我试图理解并修改包含以下代码的makefile SOURCES= cvode.cpp RcppExports.cpp OBJECTS= $(SOURCES:.cpp=.o) 我理解第一行,即分配给变量。我假设第二行与 OBJECTS = cvode.o RcppExports.o i、 例如,与$(SOURCES)中的文件名相同,但扩展名为.o。对吗 我在线阅读了GNU make的documentation,但找不到这种代码公式的帮助。这是宏吗 我询问的原因是我需要在Solaris机器上编译

我试图理解并修改包含以下代码的
makefile

SOURCES= cvode.cpp RcppExports.cpp
OBJECTS= $(SOURCES:.cpp=.o)
我理解第一行,即分配给变量。我假设第二行与

OBJECTS = cvode.o RcppExports.o
i、 例如,与
$(SOURCES)
中的文件名相同,但扩展名为
.o
。对吗

我在线阅读了GNU make的
documentation,但找不到这种代码公式的帮助。这是宏吗

我询问的原因是我需要在
Solaris
机器上编译
C
库,而
GNU make
可能不可用。我试图通过以下错误使代码更易于移植:

mksh: Fatal error in reader: = missing from replacement macro reference
这可能是GNU make的
specific。因此,我的方法是用更显式的输入(如第二个代码片段)替换以上面第二行形式编写的所有代码(在第一个代码片段中)

这里的任何指导都会很有帮助


谢谢

我不太确定您的问题是什么,但如果您正在查找有关该问题的文档,则称为a

您的makefile有几个问题:

首先,第一行的
info
功能仅在GNU make中可用。你应该把它去掉。我很有信心,这条线是造成你的问题的原因;由于Solaris版本的make无法识别
info
函数,因此它假定这是一个变量引用。然后它在内容中看到
…要创建的是:…
),并认为这是一个替换引用。因为它后面没有
=
,所以会出现此错误

第二,语法
($SHLIB)
错误;我想您在这两行中都是指
$(SHLIB)

all: ($SHLIB)
($SHLIB): $(OBJECTS) ../inst/libsundials_all.a

非常感谢您的回复。您所指的参考资料有助于我更好地理解代码。文档中提到“替换引用实际上是使用
patsubst
扩展函数的缩写”。您认为这可能会使代码不可移植(因为这可能是
gnu make
特定的)。文档的意思是,实现替换引用的代码是
patsubst
的特例,以向读者解释它。make的不同版本完全有可能以自己的方式实现替换引用,而不支持
patsubst
。但是,make的某些版本可能没有实现这种支持。另一方面,此语法是POSIX标准的一部分,用于
make
程序,因此我希望任何POSIX系统的
make
实现都能支持它。在Solaris上,默认的
make
可能不是POSIX?您的系统上是否有
/usr/xpg4/bin/make
?我已经很久没有使用Solaris了,但我记得POSIX标准实用程序经常放在
/usr/xpg4/bin
中。再次感谢。我也没有访问Solaris系统的权限,我正在构建的应用程序也需要在Solaris上编译才能被接受。也许,您可以查看一下-
makefile
可以在中找到-,我从系统中得到的错误可以在-,应用程序在各种linux系统上构建良好-,使用相同的“makevars”文件。你能帮个忙吗?哇……太棒了。你可能一眼就解决了我的问题(我认为这是不可能解决的)。太神了非常感谢你!!!