簡體   English   中英

Makefile鏈接器錯誤

[英]Makefile linker error

自從我決定將代碼組織成子目錄以來,我似乎正從一個問題轉到另一個問題。 問題自然是由Makefile引起的。 所以這是我目前所擁有的:

UNAME := $(shell uname)

# Directories
SOURCEDIR = src/
BUILDDIR = build/

# Compiler options
CC = clang++
DEBUG = -g
CFLAGS = -std=c++11 -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)

# Files
SRC = $(wildcard $(SOURCEDIR)*.cpp) $(wildcard $(SOURCEDIR)**/*.cpp)
OBJS = $(SRC:$(SOURCEDIR)%.cpp=$(BUILDDIR)%.o)

ifeq ($(UNAME), Darwin)
    LIBS = -lglfw3 -framework OpenGL -lglew -framework IOKit -framework CoreFoundation -framework ApplicationServices -framework Foundation -framework AppKit 
    BUILDDIR = ./build/osx/
endif
ifeq ($(UNAME), Linux)
    LIBS = -lglfw -lGL -lGLEW
    BUILDDIR = ./build/linux/
endif

# Build target
TARGET = test

all: $(TARGET)

$(TARGET): $(OBJS)
    $(CC) $(LFLAGS) $? -o $(TARGET) $(LIBS)

$(OBJS): $(BUILDDIR)%.o : $(SOURCEDIR)%.cpp
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -rf $(BUILDDIR)*.o $(BUILDDIR)**/*.o $(TARGET)

當它實際編譯所有內容時,我感到非常高興! 除非我對文件進行了更改並嘗試再次進行更改,否則它make我吐口水:

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)
make: *** [test] Error 1

事情是,當我make一次時,它就很好了。 問題似乎在於解決依賴關系? 為此,我需要指定一個VPATH 好吧,這是我得到的最接近的東西,除了嘗試指定VPATH並沒有什么不同。 我可能不正確地指定了它,否則我采用了錯誤的方法。

我對Makefile缺乏經驗,所以我非常感謝一些指導!

感謝Etan Reisner提供的解決方案。 問題在於$?之間的差異$? $^ 這是固定版本:

UNAME := $(shell uname)

# Directories
SOURCEDIR = src/
BUILDDIR = build/

# Compiler options
CC = clang++
DEBUG = -g
CFLAGS = -std=c++11 -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)

# Files
SRC = $(wildcard $(SOURCEDIR)*.cpp) $(wildcard $(SOURCEDIR)*/*.cpp)
OBJS = $(SRC:$(SOURCEDIR)%.cpp=$(BUILDDIR)%.o)

ifeq ($(UNAME), Darwin)
    LIBS = -lglfw3 -framework OpenGL -lglew -framework IOKit -framework CoreFoundation -framework ApplicationServices -framework Foundation -framework AppKit 
    BUILDDIR = ./build/osx/
endif
ifeq ($(UNAME), Linux)
    LIBS = -lglfw -lGL -lGLEW
    BUILDDIR = ./build/linux/
endif

# Build target
TARGET = test

all: $(TARGET)

$(TARGET): $(OBJS)
    $(CC) $(LFLAGS) $^ -o $(TARGET) $(LIBS)

$(OBJS): $(BUILDDIR)%.o : $(SOURCEDIR)%.cpp
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -rf $(BUILDDIR)*.o $(BUILDDIR)*/*.o $(TARGET)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM