如何在使用MingW和Make文件时链接到库

2022-03-12 00:00:00 linker-errors makefile mingw c++ fltk

我使用MingW和cmake下载并构建了FLTK(1.3.4.1版),它们工作得很好。 但是,我在正确链接FLTK时遇到了问题,导致在链接期间有很多未定义的引用。 我没有安装MSYS或任何其他Windows外壳程序,这意味着不能使用"fltk-config"脚本。

我对makefile的了解相当少,以下内容是使用官方文档和各种Internet来源构建的。

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 $@

此Makefile是否有明显错误,或者错误出在其他地方?


解决方案

此Makefile是否有明显错误,或者错误出在其他地方?

此Makefile有两处错误。

第1件

LDFLAGS=-L$(FLTK_BIN)/lib
LDLIBS=-lfltk

您有链接选项的常规GNU make设置:

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

LDLIBS=-lfltk
$(LDLIBS)应出现在链接中的适当位置 告诉链接器它应该链接共享库的方法libfltk.so 否则,静电图书馆libfltk.a。(在Windows上,其他扩展 均已接受)。

您的链接配方:

$(EXECUTABLE): $(OBJECTS)
    $(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 $@

实际上不是编译配方。这是一种编译和链接的方法。gcc/g++ 将始终尝试执行链接,除非命令行选项 包括-c(=仅编译)。因为食谱(正确地)不包括 任何必要的链接选项-$(LDFLAGS)$(LDLIBS)- 过早尝试的链接会失败,并且构建不会进一步进行。这个 您已记录为生成链接错误的命令行:

g++ -std=c++14 -Wall -IC:/frameworks/fltk-1.3.4-1 -v src/hw.cc -o src/hw.o

是您的"编译"配方的替换实例:

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

而不是您的链接配方:

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

要更正编译配方,请将其设置为:

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

The GNU Make documentation 很好。

相关文章