2

我目前正在通过 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

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

4

3 回答 3

2

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

于 2011-12-31T14:43:09.817 回答
1

我使用以下步骤在 Linux 上运行了 FLTK 程序“12.3 A first example”:

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

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

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

  • 运行 a.out 可执行文件

于 2012-02-03T13:22:26.743 回答
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-config
以获取 fltk-config 的帮助消息。阅读输出以确定您需要为编译、链接以及您正在使用的包的任何兼容性(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、范围和命名空间的了解比星期一要多得多。

于 2013-07-31T19:11:17.353 回答