Makefile不评估OBJECTS变量

时间:2019-05-25 14:46:59

标签: c++ makefile g++ shared-libraries

我试图构建一个Makefile,它将使用g ++构建一个共享库,但我发现它没有评估OBJECTS变量。这是在Ubuntu 18.04上,所有文件都在同一当前目录中。其次,它完全跳过了源文件的编译,直接进行链接指令的评估。为了澄清起见,我使用的是GNU Make 4.1

这是我输入make all时得到的内容

g++  -shared -pthread   -o   tree.so
g++: fatal error: no input files
 compilation terminated.
Makefile:12: recipe for target 'tree.so' failed
make: *** [tree.so] Error 1

这是我的Makefile代码

CC=g++
CFLAGS = -I/usr/local/include -Wall -std=c++17 -O3   -march=native -Ofast -ftree-vectorize
LIBS=-shared -pthread 
SOURCES=$(wildcard *.cpp)
OBJECTS=$(wildcard *.o)
TARGET=tree.so


all:$(TARGET)

$(TARGET) : $(OBJECTS)
        $(CC)  $(LIBS)  -o $(OBJECTS)  $(TARGET)

$(OBJECTS):$(SOURCES)
        $(CC)  -c -g $(CFLAGS) $(SOURCES)

clean:
       rm -f $(OBJECTS) $(TARGET)

1 个答案:

答案 0 :(得分:1)

如果您的目录中仅包含*.cpp个文件,那么还没有*.o,因此您的$(wildcard *.o)将扩展为空。

您想要获取*.cpp文件并计算相应的*.o文件:

OBJECTS=$(patsubst %.cpp,%.o,$(SOURCES))

或等效地:

OBJECTS=$(SOURCES:.cpp=.o)

现在,您的编译器命令不是最好的,因为如果您触摸任何源文件,所有命令都会被编译。您可以改用:

$(OBJECTS): %.o: %.cpp
         $(CC) -c -g $(CFLAGS) $< -o $@

这样,只有被触摸的文件才能真正重建。

另外,您的链接命令有误。应该是:

$(TARGET) : $(OBJECTS)
        $(CC)  $(LIBS)  -o $(TARGET) $(OBJECTS)

因为-o选项的参数是 output 文件,即目标文件。