我有以下makefile.am:
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = prog
DEFS =
CFLAGS =
prog_SOURCES := $(wildcard src/GUI_dialogs.cpp) src/GUI_main_win.cpp
$(info **$(prog_SOURCES)**)
如果我生成了makefile(autoreconf && ./configure
),然后运行make
我得到以下输出:
**src/GUI_dialogs.cpp src/GUI_main_win.cpp**
g++ -I. -g -O2 -MT GUI_main_win.o -MD -MP -MF .deps/GUI_main_win.Tpo -c -o GUI_main_win.o `test -f 'src/GUI_main_win.cpp' || echo './'`src/GUI_main_win.cpp
src/GUI_main_win.cpp:1:24: fatal error: ...Header not found as expected...
第一行显示prog_SOURCES
变量设置正确,但它没有首先编译GUI_dialogs对象。
如果我将prog_SOURCES更改为:
prog_SOURCES := src/GUI_dialogs.cpp src/GUI_main_win.cpp
然后GUI_dialogs对象首先按预期编译。
我知道订单可能没有定义。但如果我在那里有通配符:
prog_SOURCES := $(wildcard src/GUI_dialogs.cpp)
然后我得到:
**src/GUI_dialogs.cpp**
gcc -o prog
gcc: fatal error: no input files
compilation terminated.
为什么只是跳过通配符文件?即使它显然在变量中?
答案 0 :(得分:0)
遇到了类似的问题,从文档来看,这似乎不是一个好主意。
https://www.gnu.org/software/automake/manual/html_node/Wildcards.html
“即使您不关心可移植性,并且由于只针对GNU Make而试图使用'$(通配符...)',您都应该知道在很多地方Automake需要确切地知道哪个文件应该被处理。由于Automake不知道如何扩展'$ {wildcard ...)',因此您不能在这些地方使用它。'$ {wildcard ...)'是一个黑盒,与AC_SUBSTed变量可比为对于Automake而言。
您可以使用-Wportability标志获得有关“ $(通配符...”)构造的警告。”