如何在使用MingW和Make文件时链接到库
我使用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 很好。
相关文章