2017-04-12 186 views
0

我是Makefile的新手,我写了一个简单的Makefile来编译我的C++程序。在Makefile中更改变量的值不起作用

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

您想使用哪个'lib_wave.a'?你需要'../ lib_wave.a'还是'/ home/ubuntu/VENTOS/source/libs/lib_wave.a'?你为什么不把'../lib_wave.a'生成到'Makefile'中? – uzsolt

+0

@uzsolt:如果lib_wave.a文件存在于路径../lib_wave.a中,那么我会将LIBWAVE_PATH更新为../lib_wave.a。如果没有,那么我会使用LIBWAVE_PATH = /home/ubuntu/VENTOS/source/libs/lib_wave.a – ManiAm

回答

0

考虑这个规则的一个简化版本:

LIBWAVE_check: 
    LIBWAVE_PATH=../lib_wave.a 

规则中的每一个命令,在自己的子shell执行。命令LIBWAVE_PATH=...修改了shell变量,该变量在命令终止时会过期,因此更改无效。

要修改TSP_OBU规则可以使用的方式制作变量,您有两种选择。你可以使用它们的命令中修改它们:

TSP_OBU: ... 
    LIBWAVE_PATH=../lib_wave.a; LIBSAEJ2735_PATH=../libsaej2735.a; g++ ... 

那么对于条件语句,你既可以使用条件语句的命令中,或条件语句周围的命令,疼痛两种方式。

其他选项(我建议)是删除了“检查”的目标,并把所有的逻辑规则之外:

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