【问题标题】:% not matching zero or more characters in rule?% 不匹配规则中的零个或多个字符?
【发布时间】:2015-03-15 19:51:12
【问题描述】:

根据Defining and Redefining Pattern Rules 上的手册(如果我没看错的话):

'%' 字符匹配任何零个或多个字符的序列...

但以下内容与bench.cppbench2.cpp 都不匹配:

bench%.o : bench%.cpp
    $(CXX) $(CXXFLAGS) -DCRYPTOPP_DATA_DIR='"$(PREFIX)/share/cryptopp"' -c $<

%.o : %.cpp 
    $(CXX) $(CXXFLAGS) -c $<

这是我在运行 make 时看到的:

$ rm bench*.o
$ make static dynamic cryptest.exe PREFIX=/usr/local
make: Nothing to be done for `static'.
make: Nothing to be done for `dynamic'.
g++ -DNDEBUG -g -O2 -fPIC -march=native -pipe -c bench.cpp
g++ -DNDEBUG -g -O2 -fPIC -march=native -pipe -DCRYPTOPP_DATA_DIR='"/usr/local/share/cryptopp"' -c bench2.cpp

在上面,bench.cppbench2.cpp 都应该有 -DCRYPTOPP_DATA_DIR='"/usr/local/share/cryptopp"'。我也尝试过使用星号 (*),但没有任何乐趣。

如何制定同时匹配bench.cppbench2.cpp 的规则?

【问题讨论】:

  • 好吧,你总是可以使用benc%.o : benc%.cpp,并希望你没有任何其他来源匹配 benc*.cpp 除了bench.cppbench2.cpp :)

标签: makefile gnu-make


【解决方案1】:

根据你提供的链接

模式规则在 目标;否则,它看起来就像一个普通的规则。目标 是匹配文件名的模式; '%' 匹配任何非空 子字符串,而其他字符只匹配自己。

所以% 不匹配空字符串。

'%' 字符匹配任何零个或多个字符的序列...

指的是vpath的定义完全不同。

恐怕您必须使用bench1 而不是bench。或者,您可以使用宏定义 2 条规则,但只编写一次。

【讨论】:

  • 谢谢@mb。我最初有两条规则,但我试图将它们合并为一条规则。
【解决方案2】:

好吧,我碰巧偶然发现了有关此文档的适当部分。

根据4.4 Using Wildcard Characters in File Names,在这种情况下我可能应该使用星号。

根据 Stallman 和 GNUMake 手册,% 不是用于指定文件名的通配符:

单个文件名可以使用通配符指定多个文件。 make 中的通配符有‘*’、‘?’和‘[…]’……

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多