在Makefile中更改变量的值没有效果

时间:2017-04-12 18:33:24

标签: c++ makefile

我是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

1 个答案:

答案 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