使用MingW和makefile时如何链接库

时间:2017-02-08 16:46:09

标签: c++ makefile mingw linker-errors fltk

我使用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 个答案:

答案 0 :(得分:0)

  

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