【发布时间】:2021-08-08 12:23:11
【问题描述】:
我正在关注LLVM Kaleidoscope Tutorial (Ch. 3),在尝试链接 LLVM IR 库后遇到错误(毫无疑问来自我的 Makefile)。我的 Makefile 和项目结构:
CPP=clang++
CFLAGS=-g -Wall -std=c++14
LDFLAGS:=$(shell llvm-config --cxxflags --ldflags --system-libs --libs core)
EXEC=comp.out
SRCS:=$(shell find src -type f -name '*.cpp')
OBJS:=$(patsubst %.cpp,%.o,$(SRCS))
all: $(EXEC)
$(EXEC): $(OBJS)
$(CPP) $(CFLAGS) -o $@ $^
src/%.o: src/%.cpp
$(CPP) $(CFLAGS) $(LDFLAGS) -o $@ $<
src/ast/%.o: src/ast/%.cpp
$(CPP) $(CFLAGS) $(LDFLAGS) -o $@ $<
.PHONY: clean
clean:
rm -f $(shell find src -type f -name '*.o')
rm -f $(EXEC)
.
└── src
├── main.cpp
├── [.cpp files]
│
├── ast
│ ├── [.cpp files]
│ │
│ └── include
│ └── [.h files]
│
└── include
└── [.h files]
制作的时候报错:
clang++ -g -Wall -std=c++14 -I/usr/local/Cellar/llvm/12.0.1/include -std=c++14 -stdlib=libc++ -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -L/usr/local/Cellar/llvm/12.0.1/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM-12 src/IMRep.cpp -o src/IMRep.o
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:19: src/IMRep.o] Error 1
根据上面的错误,main.cpp 在编译错误出来之前永远不会编译。它只会到达src/IMRep.cpp 文件(不确定这是否重要)。如果我添加 -c 标志来实现它:
src/%.o: src/%.cpp
$(CPP) $(CFLAGS) $(LDFLAGS) -c $< -o $@
src/ast/%.o: src/ast/%.cpp
$(CPP) $(CFLAGS) $(LDFLAGS) -c $< -o $@
尽管有大量警告消息说链接器输入/参数未使用,但我仍然能够成功运行程序。这些警告是意料之中的,因为-c 只编译而不链接。
在main.cpp:
#include <iostream>
int main(int argc, char *argv[])
{
return 0;
}
所以这个问题不会被标记为欺骗:
[1]:main.cpp 包含在OBJS 中
[2]:添加了-c 标志并收到许多关于未使用的链接器参数/输入的警告(因为-c 用于编译,而不是链接)
[3]:我只在有一个依赖的地方使用$<,在有多个依赖的地方使用$^
[4]:无法应用此问题的答案
[5]:全部SRCS 和 OBJS 中的文件是正确的文件。我通过制定“详细”规则并打印这些值和make verbose
这让我相信我没有正确链接这些库。
【问题讨论】:
-
@AlexF 我项目中的所有
.cpp文件,包括main.cpp -
你在 src/IMRep.cpp 中有什么?那里有 main 函数吗?
-
@MaximChetrusca 只是一个包含 LLVM IR 标头的类定义