¿Cómo abordar proyectos masivos de Linux / makefile de manera efectiva?

16

Llevo 10 años desarrollando aplicaciones de Windows en C ++. Y recientemente comencé a investigar algunos proyectos de Linux, y no puedo soportar lo improductivo que soy ...

Aprendo rápido y llevo algún tiempo usando Linux como plataforma principal. Y me siento muy cómodo con Shell, los principios del sistema operativo y la GUI. Pero cuando se trata de desarrollo, parece que he vuelto a la escuela.

Tan pronto como abro un proyecto más grande, estoy atascado. La mayoría de ellos están basados ​​en archivos MAKE, así que, básicamente, cuando trato de navegarlos con QT o CodeBlocks, en el mejor de los casos, puedo usar Intellisense por archivo. Y la mayoría de las variables de tiempo se escapan del alcance.

Luego hay un tema de ir a la definición, que parece inexistente, intente unirse a un proyecto más grande de sourceforge, y estará atrapado durante días, porque navegar a las definiciones es muy difícil ... grep -r "this_def" . --include "*.cpp" --include "*.h"parece muy lento y torpe.

Y luego, la depuración, gdb funciona, pero no importa lo que haga, parece que está a años luz de WinDbg o del depurador VisualStudio.

Y estas cosas me están desesperando, quiero escribir código, pero va muy lento ... Estoy empezando a pensar que los desarrolladores de Linux aprenden las definiciones de funciones de memoria y analizan el código a simple vista, pero no puedo creer que sea entonces.

Alguien ha pasado por esto? ¿Hay algo que me falta que pueda hacerme más productivo?

Descifrador
fuente
8
+1, he llegado a la misma conclusión con respecto al depurador de Visual Studio; Ningún otro IDE en ninguna plataforma se acerca a sus capacidades de inspección.
Aphex

Respuestas:

22

Curiosamente, periódicamente tengo el mismo problema en la dirección opuesta. Soy principalmente un codificador de UNIX, pero periódicamente tengo que portar cosas a Windows. No puedo decirle la cantidad de veces que he querido arrancarme el pelo porque no puedo encontrar la casilla de verificación adecuada para una opción de compilador oculta en una de las 35 páginas de configuración de preferencias para un proyecto. Prefiero simplemente abrir el archivo de proyecto y agregar el XML yo mismo.

Moviéndose en cualquier dirección, el secreto es tener paciencia y aprender el conjunto de herramientas para la plataforma en la que está tratando de trabajar. Por supuesto que se sentirá frustrado, es nuevo y no es familiar, y se le reduce al estado de novato todo de nuevo. No hay forma de evitar esto.

En su caso particular, hay algunas herramientas adicionales que debe conocer. El primero es DDD , una interfaz gráfica de usuario para gdb. No es tan hábil como Visual Studio, pero tomará tu mano. Sin embargo, realmente recomendaría morder la viñeta y comenzar a aprender los entresijos de gdb. En verdad, si usted es un usuario habitual, no hay mucha diferencia entre memorizar qué comandos escribir y memorizar qué cuadro de diálogo debe abrir para cambiar una configuración.

También necesita saber sobre herramientas como CScope y CTags . Por mucho que te resistas, te sugiero que aprendas VIM o EMACS . Se integran bien con las herramientas de etiquetas que acabo de mencionar. Cuando fueres haz lo que vieres. Puede encontrar extensiones para VIM y EMACS que completarán el código por usted. Mi propia experiencia con herramientas que ofrecen la finalización del código es que sí, ahorra algo de escritura, pero en general es fácil. Pensar es lo que es difícil. Su opinión puede diferir, especialmente si tiene síndrome del túnel carpiano.

En cuanto a hacer. Make es ciertamente horrible, pero probablemente solo tendrás que aguantar y aprenderlo.

Charles E. Grant
fuente
66
+1, memorizar comandos no es más difícil que memorizar GUIs
Javier
55
Definitivamente aprender VIM o EMACS. La razón por la cual Linux realmente no tiene una interfaz gráfica de usuario como Visual Studio, es porque VIM y EMACS tienen las mismas características y más. Tengo mi copia de VIM configurada para usar un conjunto de complementos que me dan autocompletado con pestañas, fragmentos, navegación de proyectos, terminal integrado, etiquetas, navegación de etiquetas, conversión de espacios en blanco y todo vuelve a github . Sin embargo, en el trabajo uso Windows, así que eso es lo que usa la información de ruta en el archivo vimrc.
Spencer Rathbun
2
@Javier La última vez que lo revisé, las GUI mostraron mucha funcionalidad a la vista, sin necesidad de memorizar. La pantalla VIM carece de pistas o recordatorios.
quant_dev
2
@tdammers He visto suficiente código de Linux en mi tiempo para llamar a BS sobre eso.
quant_dev
44
@quant_dev, rápido! ¿Dónde configura la opción del vinculador para tratar los símbolos duplicados como un error? Claro, puede encontrarlo explorando todos los elementos en la sección del vinculador de las propiedades C / C ++ del proyecto, pero eso no es más (o menos) a la vista que buscarlo en la página del manual para el vinculador.
Charles E. Grant
11

Llevo 10 años desarrollando aplicaciones de Windows en C ++. Y recientemente comencé a investigar algunos proyectos de Linux, y no puedo soportar lo improductivo que soy ...

¿Hay algo que me falta que pueda hacerme más productivo?

Desarrollar en Windows, implementar en Linux.

Esto incluye ejecutar pruebas unitarias tanto en su propia máquina (Windows) como en el servidor de compilación (Linux).

Como efecto secundario, aprenderá a escribir código portátil.

Otro efecto positivo es que el uso de diferentes compiladores generará más advertencias y, por lo tanto, detectará más errores.

ACTUALIZACIÓN : Para todos los fanáticos de Linux que voten por esta respuesta: ¡No digo que todos deberían desarrollar en Windows! Pero usar la plataforma que conoces muy bien es más productivo que pasar mucho tiempo aprendiendo una nueva plataforma.

Sjoerd
fuente
¿Podría el votante indicar por qué votó en contra?
Sjoerd
Supongo que sería porque no estás respondiendo la pregunta. El problema está trabajando en un proyecto de Linux existente ; portarlo a Windows primero y luego regresarlo no es una solución viable.
tdammers
-1: Si esa fuera una opción, el OP no tendría su problema original. Y el desarrollo en Windows le brinda todos los costos del desarrollo de Windows (como el horrible procedimiento de instalación de software del siglo XVIII) y aún tiene que escribir el Makefile y depurar su aplicación con gdb, si algo no es completamente portátil.
thiton
@tdammers Revisar las fuentes y crear un proyecto desde * .cpp funciona en muchos casos. Incluso si lleva un par de horas configurarlo, es mucho menos de lo que tomaría aprender un entorno de desarrollo completamente diferente.
Sjoerd
1
Por otro lado, aprender más sobre la plataforma en la que debería trabajar parece ser natural y valioso.
Basile Starynkevitch
4

Su problema se ha resuelto muchas veces en el mundo Linux, sin embargo, a diferencia de las herramientas de Windows / Microsoft, no se entregará en una bandeja de plata con una guarnición de extras. Es posible que deba hacer un trabajo para obtenerlo.

Utilizo un editor comercial (Visual Slick Edit, que es considerado costoso por aquellos que no valoran tanto su tiempo como yo) para este problema exacto. Eclipse con el complemento CDT es un camino de código abierto que tiene muchos seguidores justificables. (No es bueno para mí, ya que a menudo necesito soporte ADA)

Lo que no hago es tratar de aplicar ingeniería inversa a los archivos MAKE en algún tipo de proyecto. Uso los sistemas integrados del IDE y agrego / elimino archivos manualmente según sea necesario. Estoy seguro de que podría escribirlo, pero el tiempo probablemente no valga la pena. Para esto, encontré que el eclipse es un poco menos utilizable que Slickedit (eso podría fácilmente (y probablemente ha cambiado) desde la última vez que lo vi)

Linux tiene una amplia gama de herramientas, los tipos que saben vi me superan en todos los aspectos de la edición, tiene búsquedas de referencias, etc., solo una curva de aprendizaje empinada. Estoy seguro de que Emacs también puede hacerlo todo, aunque nunca lo haya usado.

Mattnz
fuente
3
"Su problema se ha resuelto muchas veces en el mundo Linux, sin embargo, a diferencia de las herramientas de Windows / Microsoft, no será entregado en una bandeja de plata con una guarnición de extras". Entonces, no se ha resuelto por completo, entonces.
quant_dev
44
@quant_dev. Con razón o sin ella, es poco común que un software de Linux intente ser todo para todos los usuarios. Es más común tener el modelo donde cada pieza hace bien una pequeña cosa, y el usuario final ensambla lo que necesita para resolver sus problemas. Para un usuario de Windows, el problema no se considera resuelto, para un usuario de Linux, es, quién tiene la razón, obviamente usted cree que lo es, no lo sé, y la mayoría de los usuarios de Linux piensan que sí. Es un poco duro darme un -1 solo porque no estoy de acuerdo con la forma en que es el mundo.
mattnz
3

Por lo que vale, en Linux tiene mejores sistemas de construcción que la antigua versión GNU (que a menudo va con el horrible autoconf ), por ejemplo omake y muchos otros ( cmake, scons...).

Basile Starynkevitch
fuente
3

Una sugerencia con respecto a lo tedioso que es usar grep para buscar código: configure los alias bash en su archivo .bashrc. Entonces, es solo un comando:

alias searchCode='find -iname \*.cpp | xargs grep $1'
alias searchCodeHeaders='find -iname \*.h | xargs grep $1'

Probablemente haya mejores formas de escribir el comando, pero la idea es la misma. ¿Quieres buscar el código? escribe un alias llamado searchCode. Recuerde que aunque son tediosas y complicadas, las herramientas de Unix también se pueden usar para facilitarle la vida.

Timmah
fuente
3

Mi 2c como alguien que ha desarrollado C ++ en ambas plataformas y le gustan los dos.

1) Los Makefiles son dolorosos: el mejor consejo que puedo darle es intentar cambiar a otro sistema de compilación, si es posible.

2) Para la edición y exploración de código, hay algunas herramientas bastante útiles. Claro, no están integrados, pero en realidad no importa cuando se trata de hacer las cosas. vim + ctags + grep te llevará allí. Por supuesto, también hay IDEs, pero, francamente, no me gustó nada de lo que probé: Eclipse + CDT, KDevelop, Code :: Block. Sin embargo, puede llegar a una conclusión diferente.

3) Para la depuración, simplemente manténgase en la línea de comandos gdb. Claro, está bastante por detrás de Windbg cuando se trata de características, pero para la mayoría de los propósitos está bien. Los front-end gráficos (ddd, KDbg) eran bastante defectuosos la última vez que los probé, pero nuevamente las cosas pueden haber cambiado :)

La conclusión es: sí, debe poner un poco de esfuerzo de aprendizaje, pero después de eso será tan productivo como lo es en Windows.

Nemanja Trifunovic
fuente
A menudo corro gdbdesde adentro emacs(en Linux) y me ayuda mucho.
Basile Starynkevitch
1

Para el resto de los buenos consejos que ya recibió, me gustaría agregar un par de enlaces, respectivamente, a ack y pss .

Están dirigidos a programadores que tienen que preocuparse específicamente por el código fuente, tratando de mejorar sobre grep.

Francesco
fuente
0

Grandes respuestas Agregando a ellos,

Cuando hice este movimiento, el error que cometí fue tratar de saltar al código sin darle la debida diligencia al sistema de compilación GNU, que volvió a morderme cuando quería hacer cambios en el código. Pase el par de días necesarios para comprender cómo funcionan AutoMake / AutoConf / Make suite of tools, será muy rápido después de eso.

En cuanto a las herramientas: Eclipse + CDT / GDB + DDD realmente hace mucho.

Subu Sankara Subramanian
fuente
-1

Aquí hay algunos consejos para que funcione más fácilmente:

  1. Comienza desde el principio. Esto significa que primero usará el script bash como reemplazo de un archivo MAKE y luego archivos MAKE simples una vez que necesite dependencias. Mantenlo simple al principio. Su archivo MAKE no necesita manejar 15 plataformas Unix diferentes, solo compílelo con dependencias. (su archivo MAKE inicial se verá así: todos: g ++ -o main main.cpp) (se puede encontrar un ejemplo más complejo en http://sivut.koti.soon.fi/~terop/Makefile - al comenzar desde cero , simplemente copie el archivo al proyecto, cambie los nombres de archivo, el directorio mkdir objs, cambie las bibliotecas que desee)
  2. Olvida el IDE. Solo te hará más lento. Aprenda a leer el código y recuerde la jerarquía de archivos de su proyecto. Las herramientas normales de línea de comandos como 'cd dir' y 'emacs foo.cpp' deben ser tan automáticas que no lo pienses dos veces tipeándolo.
  3. Olvídate del resaltado de sintaxis e intellisense. Nunca funcionará de la misma manera que lo hace en Visual Studio, y las pistas que da solo te confundirán, ya que es diferente de lo que solías hacer. Aprende a no confiar en ellos.
  4. Gdb es un buen depurador. Obtendrás una pila de llamadas. Ni siquiera intentes dar la vuelta al código, no funcionará muy bien. Usa valgrind también. Los puntos de interrupción también son buenos, pero no confíes demasiado en ellos; rara vez se usa con gdb.
  5. Si su compilación es algo más que simple 'make' en el shell, debe repensar su ciclo de edición-compilación-depuración-edición.
  6. Aquí hay un truco que Visual Studio no puede hacer: muestre el archivo de encabezado y el archivo .cpp en la pantalla al mismo tiempo, de modo que ambos sean visibles sin cambiar entre ellos con pestañas. Emacs puede hacerlo. Entonces puede el bloc de notas. Visual Studio o IDE no pueden.
  7. Aprenda las combinaciones de teclas de emacs. Te hará más rápido. Una buena pista es que todas las teclas se encuentran muy cerca del teclado. Las secuencias de comandos son más largas, pero aún es más rápido escribirlas.
  8. Hay un truco fácil para reemplazar go-to-definition: escriba el código en el mismo archivo y use esc- <y Cs :: myfunction en emacs para encontrar la función que desea. El proceso es diferente si ha utilizado muchos archivos cortos: su código se verá diferente. (aprenda ctrl-f en el bloc de notas y obtendrá la idea). Pero definitivamente no necesita hacerlo en shell.
  9. El tiempo de inicio del editor de texto es muy importante. Si lleva más de 1 segundo abrirlo, no sirve. Cada IDE está roto debido a este requisito. Bloc de notas y emacs están bien.
  10. goto-line en emacs es una característica importante para la programación. Atadlo a alguna tecla. Yo uso Cx g
tp1
fuente
1
-1 para "escribir el código en el mismo archivo": ¡Debes estar bromeando! ¡Y cómo puede admitir "ni siquiera intente evitar el código" e insistir en que "Gdb es un buen depurador"!
Sjoerd
@sjoerd: Estas son solo técnicas que hemos descubierto que funcionan correctamente. Puede que no sea lo que otras personas están usando, pero funcionan bien en un entorno Linux: los programas más grandes necesariamente necesitan usar archivos más grandes. Con 10 años de experiencia en programación, ya no necesita moverse en el código: ya sabe cómo funciona la ejecución del programa y no necesita la ayuda que proporciona el paso a través del código.
tp1