2011-12-31 45 views
2

我目前在學習C++與Stroustrup編程:原理和實踐使用C++,並在第12章。我現在試圖從FLTK獲得特定標頭的工作。FLTK不能與Stroustrup標題一起工作

我已經安裝了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上進行編譯。

+0

您沒有正確鏈接並忘記了目標文件?你需要將它們包含在命令行中。 – pmr 2011-12-31 13:40:52

+0

@pmr可能的,但我是一個初學者,所以我如何包括他們? – MCPP 2011-12-31 13:48:30

回答

2

在我看來,當調用編譯器時,在/opt/local/lib/libfltk.a的前面應該有一個-l(破折號)。或者,您可以用-L/opt/local/lib -lfltk代替/opt/local/lib/libfltk.a,這可能更傳統。

1

我使用以下步驟在Linux上工作FLTK程序'12 .3第一個例子」:

然後將其解壓縮,然後轉到編程代碼/ GUI文件夾。

  • 在該文件夾中,添加#include <cstdlib>到文件std_lib_facilities.h以避免在編程代碼/ GUI文件夾中的命令行下一步驟
  • 運行make未聲明錯誤的的atoi。這應該創建文件libbookgui.a。
  • 假設該程序名爲Example.cpp,運行下面的命令:

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

  • 運行a.out可執行文件

0

使用來自源代碼的示例程序在PDF中找到FLTK-Tutorial.pdf

我不得不添加下面幾行來在我的Ubuntu L中進行乾淨的編譯inux的。

// 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,範圍和命名空間的瞭解比我在星期一做的要多得多。