FLTK 不适用于 Stroustrup 标头

FLTK not working with Stroustrup headers

本文关键字:标头 Stroustrup 适用于 不适用 FLTK      更新时间:2023-10-16

我目前正在学习 C++,这本书是 编程:使用C++ 的 Stroustrup 和第 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

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

在我看来

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

我使用以下步骤在Linux上运行FLTK程序"12.3 第一个示例":

  • 从作者的网站下载编程代码.zip

然后解压缩它并转到编程代码/GUI 文件夹。

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

    GCC `fltk-config --use-forms --use-gl --use-images --ldflags` 示例.cpp libbookgui.a

  • 运行 a.out 可执行文件

使用PDF FLTK教程中源代码的示例程序.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配置工具来帮助进行配置。

fltk-config
以获取 FLTK 配置的帮助消息。阅读输出以确定您需要为编译、链接以及您正在使用的包的任何兼容性(gl、glut、表单等(放入什么。

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

也可以使用 --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、作用域和命名空间的了解比周一要多得多。