Makefile 结合了 fltk 和 C++ 文件

Posted

技术标签:

【中文标题】Makefile 结合了 fltk 和 C++ 文件【英文标题】:Makefile combining fltk and C++ files 【发布时间】:2014-01-18 11:50:39 【问题描述】:

我正在尝试制作一个添加了 FLTK 库的 C++ 程序。另外,文件编译。但是 - 我不知道如何将它们组合成一个工作文件。我认为这可能与makefile有关:

COMP=g++
COMP_FLAGS=$(-Wall -g -std=c++11)
FL_COMP_FLAGS=$(shell fltk-config --cxxflags)
FL_LINK_FLAGS=$( fltk-config --ldflags)


program: main.o GraphicsLib.o ChaosSpaceMarine.o SpaceMarine.o Tau.o
    $(COMP) $(COMP_FLAGS) GraphicsLib.o ChaosSpaceMarine.o SpaceMarine.o Tau.o -o program
main.o: main.cc GraphicsLib.o ChaosSpaceMarine.o SpaceMarine.o Tau.o
    $(COMP) $(COMP_FLAGS) $(FL_LING_FLAGS)  main.cc GraphicsLib.o ChaosSpaceMarine.o SpaceMarine.o Tau.o -o main.o
GraphicsLib.o: GraphicsLib.cc GraphicsLib.h
    $(COMP) $(COMP_FLAGS) $(FL_COMP_FLAGS) -c GraphicsLib.cc
ChaosSpaceMarine.o: ChaosSpaceMarine.cc ChaosSpaceMarine.h Marine.o
    $(COMP) $(COMP_FLAGS)  ChaosSpaceMarine.cc Marine.o -o ChaosSpaceMarine.o
SpaceMarine.o: SpaceMarine.cc SpaceMarine.h Marine.o
    $(COMP) $(COMP_FLAGS) SpaceMarine.cc Marine.o -o SpaceMarine.o
Tau.o: Tau.cc Tau.h Marine.cc
    $(COMP) $(COMP_FLAGS) Tau.cc Marine.o -o Tau.o
Marine.o: Statystyki.o Bron.o Pancerz.o
    $(COMP) $(COMP_FLAGS) Marine.cc Bron.o Pancerz.o Statystyki.o -o Marine.o
Statystyki.o: Statystyki.cc Statystyki.h
    $(COMP) $(COMP_FLAGS) -c Statystyki.cc -o Statystyki.o
Pancerz.o: Pancerz.cc Pancerz.h Item.o
    $(COMP) $(COMP_FLAGS) -c Pancerz.cc -o Pancerz.o
Bron.o: Bron.cc Bron.h Item.o
    $(COMP) $(COMP_FLAGS) -c Bron.cc -o Bron.o
Item.o: Item.cc Item.h
    $(COMP) $(COMP_FLAGS) -c Item.cc -o Item.o

clean: 
    rm -rf Item.o Bron.o Pancerz.o Statystyki.o Marine.o Tau.o SpaceMarine.o ChaosSpaceMarine.o GraphicsLib.o

所以: Item.o 是 Bron(武器)和 Pancerz(盔甲)的基类。而Statystyki(统计)是Marine类的一部分,它是特定ChaosSpaceMarine、SpaceMarine和Tau的基础。 GraphicsLib 包含几个 FL/Fl_.... 标头,因此我可以制作自己的图形对象。

欢迎提出任何问题和建议!

编辑:

感谢 Lmis 和我的朋友,我更正了我的 makefile,如果有人遇到类似问题,我将其放在上面。

所以现在我只有一个奇怪的错误:

g++  -I/usr/local/include -I/usr/local/include/FL/images -c GraphicsLib.cc
g++  -c Statystyki.cc -o Statystyki.o
g++  -c Item.cc -o Item.o
g++  -c Bron.cc -o Bron.o
g++  -c Pancerz.cc -o Pancerz.o
g++  Marine.cc Bron.o Pancerz.o Statystyki.o -o Marine.o
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [Marine.o] Error 1

我知道它说有未定义的对 main 的引用,但是这个文件中没有这样的引用,所以出了什么问题?

【问题讨论】:

【参考方案1】:

一个问题是:

$(COMP) $(COMP_FLAGS) -o main.o GraphicsLib.o ChaosSpaceMarine.o SpaceMarine.o Tau.o

应该是

$(COMP) $(COMP_FLAGS) -o NameOfYourProgram main.o GraphicsLib.o ChaosSpaceMarine.o SpaceMarine.o Tau.o

-o 标志告诉编译器你想给它生成的文件起什么名字。您在 Makefile 中所说的是,您希望编译器使用 GraphicsLib.o 等对象编译名为 main.o 的程序。

既然你说

另外,文件编译。

我假设所有.o-文件都编译得很好,然后这个答案应该可以解决你的问题。

【讨论】:

以上是关于Makefile 结合了 fltk 和 C++ 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 MingW 和 makefile 时如何链接库

使用 Makefile 编译使用图像的 FLTK 源代码时出错

如何在 C++ 和 FLTK 中实现倒计时时钟?

如何修复“Programmin 原则和实践使用 C++”一书中的 FLTK 头文件?

带有 Microsoft Visual C++ 2010 Express 的 FLTK-1.1.10

C++:帮助安装 FLTK