【问题标题】:Target specific variable definition not working when concatenating variables连接变量时,目标特定变量定义不起作用
【发布时间】:2020-09-15 01:15:02
【问题描述】:

我希望我的 Makefile 行为不同,具体取决于我是在自己的机器上还是在 docker 容器内编译。这是 Makefile:

OR_TOOLS_DIR := /share/me/binaries/or-tools_Ubuntu-16.04-64bit_v7.8.7959
docker: OR_TOOLS_DIR := /lib/or-tools_Ubuntu-16.04-64bit_v7.8.7959
OR_TOOLS_LIB_DIR := $(OR_TOOLS_DIR)/lib
OR_TOOLS_INC_DIR := $(OR_TOOLS_DIR)/include
OR_TOOLS_FLAGS := -L$(OR_TOOLS_LIB_DIR) -lglog -lprotobuf -lgflags -lCbc -lCbcSolver -lClp -lClpSolver -lCoinUtils -lOsiCbc -lOsiClp -lCgl -lortools

HTSLIBFLAGS = /software/htslib/1.8/lssc0-linux/lib/libhts.a -lz -llzma -lbz2 -lcurl -lcrypto
docker: HTSLIBFLAGS = -lz -llzma -lbz2 -lcurl -lcrypto -lhts

CXX = g++
LDFLAGS = -lm -lpthread $(HTSLIBFLAGS) $(OR_TOOLS_FLAGS)
CXXFLAGS = -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I $(OR_TOOLS_INC_DIR)

HPP = $(wildcard *.hpp)
SRC = $(wildcard *.cpp)
OBJ = $(SRC:.cpp=.o)

all: main

debug: CXXFLAGS += -DDEBUG -g
debug: main

docker: main

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

main: $(OBJ) $(HPP)
        $(CXX) $(CXXFLAGS) -o $@ $(OBJ) $(LDFLAGS)

clean:
        rm *.o
.PHONY: clean

这是运行make docker时使用的命令:

g++ -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I /share/me/binaries/or-tools_Ubuntu-16.04-64bit_v7.8.7959

而我期待:

g++ -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I /lib/or-tools_Ubuntu-16.04-64bit_v7.8.7959

我认为我连接不同变量的事实可能与此有关,但我不确定。我错过了什么?

【问题讨论】:

    标签: c++ makefile gnu-make


    【解决方案1】:

    Make 有 two flavors of variable简单 扩展变量,递归 扩展变量。

    这里:

    OR_TOOLS_DIR := /share/...
    ...
    OR_TOOLS_INC_DIR := $(OR_TOOLS_DIR)/include
    

    请注意,此 makefile 使用 :=OR_TOOLS_INC_DIR 赋值,因此它是一个简单扩展变量。现在它的值是/share/.../include

    稍后,在执行规则时,您为 OR_TOOLS_DIR 分配了一个新的(特定于目标的)值。但那只鸟飞了; OR_TOOLS_INC_DIR的值为/share/.../include,与OR_TOOLS_DIR不再有任何联系。

    你需要的是一个值为$(OR_TOOLS_DIR)/include的变量,这样你以后可以更改$(OR_TOOLS_DIR),从而改变扩展变量的结果。你可以通过 recursive 扩展来实现它。只需删除冒号:

    OR_TOOLS_INC_DIR = $(OR_TOOLS_DIR)/include
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多