c++ - Stroustrup''s Simple_window.h
header fltk (5)
Intento que los ejemplos de gráficos funcionen a partir de los Principios y Prácticas de Stroustrup ... C ++, en vano (aún). He instalado las cosas de fltk, y sé que está funcionando bien, ya que pude obtener una ventana para mostrar usando un programa sugerido en el apéndice de su libro:
#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Window.H>
int main(){
Fl_Window window(200,200, "title here");
Fl_Box box(0,0,200,200,"Hey, hello wrld");
window.show();
return Fl::run();
}
Sin embargo, probar el mío usando Simple_window.h (se puede encontrar en su sitio) da "referencia a ''Ventana'' es ambigua", ya que ya está en usr / include / X11 / Xh. Así que traté de especificar el espacio de nombres para el relevante:
struct Simple_window : Graph_lib::Window { //Changed Window to inc. namespace
Simple_window(Point xy, int w, int h, const string& title );
bool wait_for_button(); // simple event loop
.
.
.
Pero esto me da un montón más de errores que no entiendo:
$ clear; g++ -Wno-deprecated window.cpp -o holz
/tmp/ccIFivNg.o: In function `main'':
window.cpp:(.text+0x64): undefined reference to `Simple_window::Simple_window(Point, int, int, String const&)''
/tmp/ccIFivNg.o: In function `Graph_lib::Window::~Window()'':
window.cpp:(.text._ZN9Graph_lib6WindowD2Ev[_ZN9Graph_lib6WindowD5Ev]+0x14): undefined reference to `vtable for Graph_lib::Window''
etc.
Siento que dominar los gráficos va a ser un camino largo y difícil -_-
Bueno, esto realmente no tiene nada que ver con los gráficos como tal. El problema parece ser que solo ha incluido en su línea de comandos uno de los archivos fuente que necesita compilar. A juzgar por su sitio web
g ++ graph.cpp GUI.cpp Simple_window.cpp Window.cpp
parece ser más como eso. Pero no tengo una experiencia real de esto.
Tomolak, cuando dijiste que esto ''progresó'', me gustó mucho. No sé si estuviste siendo sarcástico, pero lo que sea.
He resuelto este problema (o al menos he logrado que aparezca una ventana con un triángulo). Sin embargo, esto fue solo después de comentar y editar grandes porciones del código de Stroustrup. No creo que su libro sea muy adecuado para un principiante. Tampoco recomendaría intentar compilar alguno de sus ejemplos utilizando Linux.
Para cualquier persona que busca en Google estos problemas, mi solución final fue este comando:
$ g++ -Wno-deprecated -I/usr/local/include -I/usr/include/freetype2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -o ''windows_working'' win_test.cpp Graph.cpp GUI.cpp Simple_window.cpp Window.cpp /usr/local/lib/libfltk.a -lXext -lXft -lfontconfig -lXinerama -lpthread -ldl -lm -lX11
Esto incluye todo lo que se requiere con respecto a las cosas de fltk y cosas de Stroustrup. Aquí, mi programa es win_test.cpp y el resultado es windows_working. Obtuve esta búsqueda a través del script de shell proporcionado con los archivos fltk y lo puse en / usr / inc / bin. Se llama fltk-config.
Además, los consejos útiles son: descargue la fuente fltk de su sitio, no solo la FL del sitio de Stroustrup. Luego lea el archivo Léame y siga las instrucciones exactamente antes de probar el programa de prueba en el apéndice D del libro. Luego prueba con su código de ejemplo fijando los errores que encuentres hasta que funcionen. Si cree que podría ayudar o desea saber cómo obtuve mi solución, envíeme un correo electrónico (pero soy un principiante y, por lo tanto, es poco probable que lo utilice).
Nathan,
Su respuesta fue inmensamente útil para mí en mi propia lucha por implementar el sencillo programa de triángulos de Stroustrup. Me gustaría publicar mi propia solución basada en la tuya. Con un cambio en el código de Stroustrup y un script de compilación muy expandido, obtuve el triángulo para que aparezca.
g++ -I/usr/localinclude -I/usr/local/include/FL/images -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_THREAD_SAFE -D_REENTRANT -o ''myimplementationofstroustrup.o'' ''myimplementationofstroustrup.cpp'' ''Simple_window.cpp'' ''Graph.cpp'' ''GUI.cpp'' ''Window.cpp'' /usr/local/lib/libfltk.a -lpthread -ldl -lm -lX11 -L/usr/local/lib -lfltk_images -lfltk_png -lfltk_z -lfltk_jpeg -lfltk
Las diferencias con los tuyos son las siguientes:
1) Tuve que agregar citas a todos mis archivos .cpp ... ¿diferencia del sistema, tal vez?
2) Tuve que agregar seis banderas al final que no usaste, o bien recibí más errores de "referencia no definida".
3) Tuve que especificar "Graph_lib :: Window" en la línea 17 de Simple_window.h debido a un error de referencia ambiguo. Este fue el único cambio que tuve que hacer en el código de Stroustrup.
Para cualquiera que esté en la misma situación, dejo aquí lo que hice para finalmente poder compilar y obtener la ventana del primer programa con FLTK en la sección 12.3 del libro de Stroustrup "Programación: Principios y práctica usando C ++, 2da edición".
Después de instalar FLTK en Kubuntu 14.04 con
$ sudo apt install libfltk1.3-dev
Pude compilar el programa de ejemplo en el Apéndice D con el uso de
$ fltk-config --compile fltkTest.cpp
Gracias a esta publicación, pude ver cómo finalmente pude ponerme en marcha con el primer ejemplo del capítulo 12. Comparando el comando de cwivagg y Nathan con el comando generado con fltk-config, terminé con este comando
$ clang++ -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/freetype2 -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -g -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -Wl,-Bsymbolic-functions -lfltk_images -lfltk -lX11 -std=c++11 -o ''s12_3_first'' ''s12_3_first.cpp'' Simple_window.cpp Graph.cpp GUI.cpp Window.cpp
Tuve que agregar -lfltk_images y -std = c ++ 11
Sin embargo, ahora tuve que lidiar con los errores que el compilador me dio. Para obtener un programa en funcionamiento, tuve que hacer varios cambios a las fuentes que Stroustrup dio en http://www.stroustrup.com/Programming/PPP2code/
- Comenté std_lib_facilities.h en Graph.h
- Para resolver la ambigüedad de Window, necesitaba especificar Graph_lib :: Window en la línea 9 de Simple_window.h
- std_lib_facilities.h en las líneas 107 y 113 usa una comparación i <0 cuando no estoy firmado (pero estas son solo advertencias).
- Graph.h línea 159 usa fl_color () pero el compilador dice que debería ser Fl_Color
- Necesitaba descomentar los constructores para Point in Point.h
- Hay varias redefiniciones en Simple_window.cpp de Simple_window.h En Simple_window.cpp comenté las definiciones para el constructor, cb_next y wait_for_button (que no es el mismo que el de Simple_window.h). En Simple_window.h comenté las definiciones de wait_for_button y next. Por cierto, wait_for_button no funciona de ninguna forma.
- En GUI.cpp hay otra redefinición para el constructor de Menú. Lo comenté.
- Cambié la última línea del ejemplo de la sección 12.3 de win.wait_for_button; a Fl :: ejecutar (); que tomé del ejemplo en el Apéndice D, porque de lo contrario la ventana no se cierra con su botón de cerrar.
Con todos estos cambios finalmente tengo la ventana como debería ser, y la ventana se cierra con el botón Siguiente o el botón Cerrar de dicha ventana (con wait_for_button necesitaba finalizar el programa desde Konsole con Ctrl-c después de intentar ciérralo con el botón de cerrar de la ventana).
Espero que la próxima persona no tenga que pasar todo el tiempo que deba.
Editar: Bueno, revisando mi sistema y el comando de compilación, me di cuenta de que hay varias alfombras repetidas ... y que en realidad no existen en mi sistema Kubuntu. Entonces, tengo que escribir en mi respuesta lo que finalmente hago para que la ventana funcione:
Para obtener un archivo de objeto:
$ clang++ -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -g -std=c++11 -c Simple_window.cpp
Para obtener el primer programa que queríamos
% clang++ -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -Wl,-Bsymbolic-functions -lfltk_images -lfltk -lX11 -g -std=c++11 Simple_window.o Graph.o GUI.o Window.o -o z3 s12_3_first.cpp
Estos son mucho más fáciles (casi los puedo escribir cada vez que los necesito)
Este resumen de problemas y soluciones también es muy útil para que funcione en las diferentes plataformas. El código correcto corregido está disponible para descargar: