使用 MingW 和 makefile 时如何链接库

Posted

技术标签:

【中文标题】使用 MingW 和 makefile 时如何链接库【英文标题】:How to link against libraries when using MingW and makefiles 【发布时间】:2017-02-08 16:46:09 【问题描述】:

我使用 MingW 和 cmake 下载并构建了 FLTK (v. 1.3.4.1),效果很好。 但是,我在正确链接 FLTK 时遇到问题,导致链接期间出现大量未定义的引用。 我没有安装 MSYS 或任何其他适用于 Windows 的 shell,这意味着不能使用“fltk-config”脚本。

我对 makefile 的了解相当少,以下是使用官方文档和各种互联网资源构建的。

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 是否有明显的问题,或者错误是否存在于其他地方?

【问题讨论】:

【参考方案1】:

这个 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 很好。

【讨论】:

听从了您的明智建议,但错误仍然比比皆是。见link @slimandstacked 请发布失败的完整输出,而不仅仅是错误。 谢谢,修复了 makefile 问题。 fltk 需要许多其他库才能正常工作,但这超出了这个问题的范围。

以上是关于使用 MingW 和 makefile 时如何链接库的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“生成器 MinGW Makefiles 不支持平台规范,但指定了 x64 平台?

如何在 Ace Root 中为 MingW-64 构建没有 MakeFile 的 ACE

SDL2 库的静态链接

在windows平台如何用MinGW编译工程?工程中有Makefile.an和Makefile.in文件,要输入啥命令呢?

从 MinGW 链接到 OpenCV 的问题

产生makefiles文件后,make命令不可用