【问题标题】:How to link against libraries when using MingW and makefiles使用 MingW 和 makefile 时如何链接库
【发布时间】: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 是否有明显的问题,或者错误是否存在于其他地方?

【问题讨论】:

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


    【解决方案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 需要许多其他库才能正常工作,但这超出了这个问题的范围。
    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多