FLTK无法使用Stroustrup标头

时间:2011-12-31 13:34:46

标签: c++ fltk

我目前正在学习使用Stroustrup编程:原理和实践使用C ++的书来学习c ++,我在第12章。我现在正在尝试使用特定标头工作的FLTK。

我已经使用MacPorts安装了FLTK。当我试图编译包括Simple_window.h的代码时,我得到以下错误:

bash-3.2# fltk-config --compile main.cpp

/usr/bin/g++-4.2 -arch i386 -I/opt/local/include -pipe -arch i386 -arch i386 
-D_THREAD_SAFE -D_REENTRANT -o main main.cpp -arch i386 -arch i386
 /opt/local/lib/libfltk.a -lpthread -framework Carbon -framework 
ApplicationServices 

Undefined symbols:
  "vtable for Graph_lib::Window", referenced from:
      __ZTVN9Graph_lib6WindowE$non_lazy_ptr in cc1oxcSA.o
     (maybe you meant: __ZTVN9Graph_lib6WindowE$non_lazy_ptr)
  "vtable for Graph_lib::Button", referenced from:
      __ZTVN9Graph_lib6ButtonE$non_lazy_ptr in cc1oxcSA.o
 (maybe you meant: __ZTVN9Graph_lib6ButtonE$non_lazy_ptr)
  "Simple_window::Simple_window(Point, int, int, String const&)", referenced from:
  _main in cc1oxcSA.o
  "Graph_lib::Window::draw()", referenced from:
  vtable for Simple_windowin cc1oxcSA.o
  "typeinfo for Graph_lib::Window", referenced from:
  typeinfo for Simple_windowin cc1oxcSA.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

我不知道这意味着什么。我读了答案here (SO)。我创建了.o文件。我正在尝试使用fltk-config在Mac OS上编译它。

3 个答案:

答案 0 :(得分:2)

在我看来,当你调用编译器时,-l前面应该有一个/opt/local/lib/libfltk.a(破折号)。或者您可以将/opt/local/lib/libfltk.a替换为-L/opt/local/lib -lfltk,这可能更为传统。

答案 1 :(得分:1)

我得到了FLTK计划' 12.3第一个例子'使用以下步骤在Linux上工作:

然后解压缩并转到Programming-code / GUI文件夹。

  • 在该文件夹中,将#include <cstdlib>添加到文件std_lib_facilities.h中,以避免在下一步中出现未声明的错误
  • 在Programming-code / GUI文件夹中的命令行运行make。这应该创建文件libbookgui.a。
  • 假设程序名为Example.cpp,请运行以下命令:

    gcc `fltk-config --use-forms --use-gl --use-images --ldflags` Example.cpp libbookgui.a

  • 运行a.out可执行文件

答案 2 :(得分:0)

使用PDF FLTK-Tutorial.pdf

中的源代码示例程序

我必须添加以下行才能在我的Ubuntu Linux中进行干净的编译。

// 3 includes just below are not in the example but are required
// for a clean compile
#include <Fl/x.H>
#include <stdlib.h>
#include <stdio.h>

您必须正确配置编译行。 FLTK有fltk-config工具来帮助配置。

<强> FLTK-配置
获取fltk-config的帮助信息。阅读输出以确定您需要为编译,链接以及您正在使用的软件包的任何兼容性(gl,过剩,表单等)添加内容。

将此信息复制到编译命令中。

您也可以使用--compile prgrname.cxx开关直接编译。包括-g,因为你需要gdb支持。

例如:

fltk-config --cxxflags --ldflags

给(对我而言):

-I/usr/include/freetype2 -g -O2 -D_THREAD_SAFE -D_REENTRANT -Wl,-Bsymbolic-functions -lfltk

添加输出名称和输入程序:

gcc -I/usr/include/freetype2 -g -O2 -D_THREAD_SAFE -D_REENTRANT -Wl,-Bsymbolic-functions -lfltk mousedrawtest.cpp mousedraw.cpp -o b.out

虽然没有什么可以学习FLTK,但它不适合胆小的人。 Erco(Greg Ercolano)的教程非常出色,并提供了许多常见挑战的示例代码。 http://seriss.com/people/erco/fltk/

http://www.fltk.org/documentation.php/doc-1.1/basics.html

还有很多其他好的搜索:FLTK教程

从简单的示例程序转换为真实的面向对象的模型时,请记住范围,特别是顶级窗口及其内容。

今天,星期三,我比周一更了解gdb,范围和名称空间。