C++ 生成文件错误“主可执行文件的隐式入口/启动”

mat*_*656 0 c++ macos compiler-errors makefile

我的项目有这个结构:

root
|____Makefile
|
|___src
|     |____*.cpp  
|
|___includes
|      |___*.h
|
|___obj
|___tmp
|___bin
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试使我收到此错误时:

g++ -std=c++11 obj/book.o -o bin/main
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: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

我的 main.cpp 位于 src 内,而不是我有一个文件 .h,我在其中声明了一个结构和一些函数以及一个 .cpp,我在其中定义了所有内容。在主要和 cpp 我做

root
|____Makefile
|
|___src
|     |____*.cpp  
|
|___includes
|      |___*.h
|
|___obj
|___tmp
|___bin
Run Code Online (Sandbox Code Playgroud)

我如何编译和解决这个问题?这是我的生成文件:

CXX = g++
CXXFLAGS = -std=c++11 -I..
LDFLAGS = -std=c++11
EXECUTABLE= bin/main
SOURCES = $(wildcard src/*.cpp)
HEADERS = $(wildcard includes/*.h)
OBJECTS = $(patsubst src/%.cpp, obj/%.o, $(SOURCES))

BASE = $(USER)

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CXX) $(LDFLAGS) $< -o $@

obj/%.o: src/%.cpp
    $(CXX) -c $(CXXFLAGS) $< -o $@

clean: 
    rm $(OBJECTS)

rmproper:
    rm $(OBJECTS) $(EXECUTABLE)

pdf:
    a2ps Readme.txt makefile $(HEADERS) $(SOURCES) -o /tmp/out.ps
    ps2pdf /tmp/out.ps $(BASE).pdf

zip:
    zip $(BASE).zip Readme.txt makefile $(HEADERS) $(SOURCES)
Run Code Online (Sandbox Code Playgroud)

Joh*_*ulé 5

问题在这里:

$(EXECUTABLE): $(OBJECTS)
    $(CXX) $(LDFLAGS) $< -o $@
Run Code Online (Sandbox Code Playgroud)

$<是第一个先决条件,即$(OBJECTS)列表中的第一个目标文件(这恰好是book.o根据您的错误消息)。你想传递什么是目标文件的完整列表,这可以通过使用来完成$^,甚至$(OBJECTS)代替$<