Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连接变量时,特定于目标的变量定义不起作用_C++_Makefile_Gnu Make - Fatal编程技术网

C++ 连接变量时,特定于目标的变量定义不起作用

C++ 连接变量时,特定于目标的变量定义不起作用,c++,makefile,gnu-make,C++,Makefile,Gnu Make,我希望根据我是在自己的机器上编译还是在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_DI

我希望根据我是在自己的机器上编译还是在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
而我期望:

g++ -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I /lib/or-tools_Ubuntu-16.04-64bit_v7.8.7959
我认为我连接不同变量的事实可能与此有关,但我不确定。我缺少什么?

Make有:简单扩展变量和递归扩展变量

在这里:

请注意,此makefile使用
:=
或\u TOOLS\u INC\u DIR
赋值,因此它是一个简单的扩展变量。其值现在为
/share/../include

稍后,在执行规则时,将新的(特定于目标的)值分配给
或\u TOOLS\u DIR
。但是那只鸟已经飞了;
或\u TOOLS\u INC\u DIR
的值为
/share/../include
,它不再与
或\u TOOLS\u DIR
有任何连接

您需要的是一个值为
$(或\u TOOLS\u DIR)/include
,以便以后可以更改
$(或\u TOOLS\u DIR)
,从而更改展开变量的结果。你可以通过递归展开来实现。只需删除冒号:

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