我是Makefile的新手,我编写了一个简单的Makefile来编译我的C ++程序。
TSP_OBU目标检查父文件夹中是否存在两个库(lib_wave.a和libsaej2735.a)。如果是,则更改“LIBWAVE_PATH”和“LIBSAEJ2735_PATH”变量的默认值(在目标LIBWAVE_check和LIBSAEJ2735_check中)。但显然更改'LIBWAVE_PATH'和'LIBSAEJ2735_PATH'变量没有任何效果,并且始终使用默认值(在Makefile顶部定义)。
LIBWAVE_PATH = /home/ubuntu/VENTOS/source/libs/lib_wave.a
LIBSAEJ2735_PATH = /home/ubuntu/VENTOS/source/libs/libsaej2735.a
all: TSP_OBU
# link
TSP_OBU: TSP_OBU.o gps.o wave.o LIBWAVE_check LIBSAEJ2735_check
g++ -std=c++11 -g -o TSP_OBU out/TSP_OBU.o out/gps.o out/wave.o -lboost_filesystem -lboost_system -lgps -lm -pthread $(LIBWAVE_PATH) $(LIBSAEJ2735_PATH)
# compile TSP_OBU
TSP_OBU.o: src/TSP_OBU.cc
g++ -std=c++11 -Wall -g -O2 -c -o out/TSP_OBU.o src/TSP_OBU.cc
# compile gps
gps.o: src/gps.cc
g++ -std=c++11 -Wall -g -O2 -c -o out/gps.o src/gps.cc
# compile wave
wave.o: src/wave.cc
g++ -std=c++11 -Wall -g -O2 -c -o out/wave.o src/wave.cc
# check if 'lib_wave.a' exists
LIBWAVE_check:
ifeq (,$(wildcard ../lib_wave.a))
ifeq (,$(wildcard $(LIBWAVE_PATH)))
$(error 'lib_wave.a' does not exist in $(LIBWAVE_PATH))
endif
else
LIBWAVE_PATH=../lib_wave.a
endif
# check if 'libsaej2735.a' exists
LIBSAEJ2735_check:
ifeq (,$(wildcard ../libsaej2735.a))
ifeq (,$(wildcard $(LIBSAEJ2735_PATH)))
$(error 'libsaej2735.a' does not exist in $(LIBSAEJ2735_PATH))
endif
else
LIBSAEJ2735_PATH=../libsaej2735.a
endif
# clean
clean:
rm -rf TSP_OBU
rm -rf out/TSP_OBU.o
rm -rf out/gps.o
rm -rf out/wave.o
答案 0 :(得分:0)
考虑此规则的更简单版本:
LIBWAVE_check:
LIBWAVE_PATH=../lib_wave.a
规则中的每个命令都在自己的子shell中执行。命令LIBWAVE_PATH=...
修改 shell 变量,该变量在命令终止时到期,因此更改无效。
要以TSP_OBU
规则可以使用的方式修改 Make 变量,您有两种选择。您可以在使用它们的命令中修改它们:
TSP_OBU: ...
LIBWAVE_PATH=../lib_wave.a; LIBSAEJ2735_PATH=../libsaej2735.a; g++ ...
然后对于条件,您可以在命令中使用 shell 条件,或者使条件围绕命令,这是一种痛苦。
另一个选项(我建议)是删除"检查"目标并将所有这些逻辑置于规则之外:
LIBWAVE_PATH = /home/ubuntu/VENTOS/source/libs/lib_wave.a
ifeq (,$(wildcard ../lib_wave.a))
ifeq (,$(wildcard $(LIBWAVE_PATH)))
$(error 'lib_wave.a' does not exist in $(LIBWAVE_PATH))
endif
else
LIBWAVE_PATH=../lib_wave.a
endif
......同样适用于LIBSAEJ2735_PATH
。