我有一个链接错误,我很难理解。以下是错误消息:
duplicate symbol _main in:
objs/MyFile.o
/var/folders/h7/f0t4_h4130bcvkjm7ms7y9_w0000gp/T/MyFile-f334a7.o
ld: 1 duplicate symbol for architecture x86_64一开始,在四处寻找答案之后,我想我可能不小心在头文件中声明了什么。我继续并删除了我自己的所有头文件,但我仍然得到错误。
再加上错误消息中的两个文件并不都是/var/folder文件,就像许多标头声明中的错误一样,这让我觉得这可能与我的Makefile有关,我最近一直在使用这个文件。
下面是Makefile:
CXX = clang++
LDFLAGS = -lm -lxml2
SRCDIR = src
OBJDIR = objs
SOURCES = $(wildcard src/*.cc)
HEADERS = $(wildcard src/*.h)
OBJECTS = $(patsubst src/%.cc,$(OBJDIR)/%.o,$(SOURCES))
objs/%.o : src/%.cc
@echo "Building object $@"
@$(CXX) $(CXXFLAGS) -o $@ -c $<
TARGETS = src/MyFile
default: $(TARGETS)
src/MyFile: $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ -I $^ $(LDFLAGS) src/MyFile.cc
Makefile.dependencies:: $(SOURCES) $(HEADERS)
$(CXX) $(CXXFLAGS) -MM $(SOURCES) > Makefile.dependencies
-include Makefile.dependencies
.PHONY: clean spartan
clean:
@rm -f $(TARGETS) $(OBJECTS) core Makefile.dependencies
spartan: clean
@rm -f *~ .*~任何和所有的帮助,在找出什么可能导致这一点是非常感谢的!
发布于 2015-09-22 19:50:45
概述
我不明白这一行,认为它会导致错误:
$(CXX) $(CXXFLAGS) -o $@ -I $^ $(LDFLAGS) src/MyFile.cc首先,-I $^没有多大意义,因为-I后面应该是包含目录路径,您可能希望它是-I . $^。
其次,您不需要src/MyFile.cc,因为它应该以objs/MyFile.o的形式出现在$(OBJECTS)中。
解决方案
将链接器命令更改为此应该会有所帮助:
$(CXX) $(CXXFLAGS) -o $@ -I . $^ $(LDFLAGS)发生了什么
最后一个链接命令看起来类似于:
compiler file.o file.cpp编译器驱动程序(此处为clang++)在参数列表中查看源文件,并将其编译为将输出放入临时文件(此处为/var/folders/h7/f0t4_h4130bcvkjm7ms7y9_w0000gp/T/MyFile-f334a7.o),而实际的链接命令如下:
linker file.o differently/named/file.o因此,重复符号错误:链接器的参数列表中有两个相同源文件的对象文件。
https://stackoverflow.com/questions/32723809
复制相似问题