使用 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
在windows平台如何用MinGW编译工程?工程中有Makefile.an和Makefile.in文件,要输入啥命令呢?