c++ - 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)
解决方案
如果您的目录中只有*.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
选项的参数是输出文件,即目标。
推荐阅读
- jacoco - Jacoco 不包含 Spring Cloud 合约生成的测试源
- flutter - 如何在 Flutter 的同一页面上呈现 List 和 Grid?
- vue.js - Vue.js 模态对话框输入表单
- javascript - 如何为每个新对象创建不同的 URL
- python - Python,需要帮助将变量分解为列表
- javascript - JavaScript TypeError 仅在 IE 11 中
- android - Exoplayer:从本地文件播放视频时,循环创建 OutOfMemoryError
- apache-spark - 如何将 JSON 字符串数组分解为行?
- html - Angular 8:将表单数据作为服务发送到另一个组件
- c++ - Visual Studio Code 不理解 CMake -DDEBUG