C++ 使用MingW和makefile时如何链接库

C++ 使用MingW和makefile时如何链接库,c++,makefile,mingw,linker-errors,fltk,C++,Makefile,Mingw,Linker Errors,Fltk,我使用MingW和cmake下载并构建了FLTK(1.3.4.1版),这两个版本运行得非常好。 然而,我在正确地链接FLTK时遇到了问题,导致链接过程中出现了大量未定义的引用。 我没有安装MSYS或任何其他Windows shell,这意味着使用“fltk config”脚本不是一个选项 我对makefiles的了解非常少,下面是使用官方文档和各种互联网资源构建的 CC=g++ FLTK_INC=C:/frameworks/fltk-1.3.4-1 FLTK_BIN=C:/frameworks/

我使用MingW和cmake下载并构建了FLTK(1.3.4.1版),这两个版本运行得非常好。 然而,我在正确地链接FLTK时遇到了问题,导致链接过程中出现了大量未定义的引用。 我没有安装MSYS或任何其他Windows shell,这意味着使用“fltk config”脚本不是一个选项

我对makefiles的了解非常少,下面是使用官方文档和各种互联网资源构建的

CC=g++
FLTK_INC=C:/frameworks/fltk-1.3.4-1
FLTK_BIN=C:/frameworks/fltk-1.3.4-1/bin
CFLAGS=-std=c++11 -Wall -I$(FLTK_INC) -v
LDFLAGS=-L$(FLTK_BIN)/lib
LDLIBS=-lfltk
EXT=cc
SOURCES=$(wildcard src/*.$(EXT))
OBJECTS=$(SOURCES:.$(EXT)=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.$(EXT).o:
    $(CC) $(CFLAGS) $< -o $@
CC=g++
FLTK_INC=C:/frameworks/FLTK-1.3.4-1
FLTK_BIN=C:/frameworks/FLTK-1.3.4-1/BIN
CFLAGS=-std=c++11-Wall-I$(FLTK_INC)-v
LDFLAGS=-L$(FLTK_-BIN)/lib
LDLIBS=-lfltk
EXT=cc
SOURCES=$(通配符src/*.$(EXT))
对象=$(源:.$(外部)=.o)
可执行文件=你好
全部:$(源)$(可执行)
$(可执行文件):$(对象)
$(CC)$(LDFLAGS)$(对象)-o$@
.$(分机)o:
$(CC)$(CFLAGS)$<-o$@
这个makefile是否有明显的错误,或者错误是否存在于其他地方

这个makefile是否有明显的错误,或者错误是否存在于其他地方

这个makefile有两个问题

事情1

LDFLAGS=-L$(FLTK_BIN)/lib
LDLIBS=-lfltk
您有传统的GNU链接选项设置:

LDFLAGS=-L$(FLTK_BIN)/lib
$(LDFLAGS)
应出现在链接中的适当位置 告诉链接器它应该在目录中搜索的方法
$(FLTK_-BIN)/lib
用于使用
-l
选项(之前)指定的任何库 在其默认目录中搜索)

$(LDLIBS)
应出现在链接中的适当位置 告诉链接器它应该链接共享库
libfltk.so
否则,静态库
libfltk.a
。(在Windows、其他扩展上) (已接受)

您的链接配方:

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
在适当的位置有
$(LDFLAGS)
,但没有
$(LDLIBS)
在任何地方因此,链接器不会尝试链接
libfltk
。 这很可能解释了您提到的未定义的引用错误, 虽然我不能绝对肯定,因为你还没有透露它们是什么

链接配方应为:

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@ $(LDLIBS)
或者更传统地说:

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS)
事情2

您的编译配方:

.$(EXT).o:
    $(CC) $(CFLAGS) $< -o $@
$(CC) $(CFLAGS) $< -o $@
是“编译”配方的替换实例:

要更正编译配方,请执行以下操作:

$(CC) $(CFLAGS) $< -c -o $@
$(CC)$(CFLAGS)$<-c-o$@

很好。

遵循了你明智的建议,但错误仍然很多。请参阅@slimandstacked。请发布失败make的完整输出,而不仅仅是错误。谢谢,这修复了makefile问题。fltk需要很多其他LIB才能正常工作,但这超出了这个问题的范围。
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
$(CC) $(CFLAGS) $< -c -o $@