我试图构建一个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)
答案 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 文件,即目标文件。