我使用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有什么明显的错误,或者错误是否在其他地方?
答案 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 $@