首页 > 解决方案 > Makefile 不评估 OBJECTS 变量

问题描述

我正在尝试构建一个 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)

标签: c++makefileg++shared-libraries

解决方案


如果您的目录中只有*.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选项的参数是输出文件,即目标。


推荐阅读