2010-08-14 11 views
5

Soy un desarrollador de Java y nunca me tengo que preocupar de incluir archivos o jugar con archivos BUILD.¿Cómo dominar los enlaces/dependencias de C++?

Cada vez que necesito escribir el código C++, las cosas se vuelven más complicadas. Puedo pensar en crear archivos * .h como interfaces en Java, pero averiguar cómo escribir el archivo de compilación y en qué orden deben incluirse las clases me da dolor de cabeza.

¿Hay una manera simple de pensar en esto? ¿Cómo sabe cuándo incluir algo o cómo separarlo adecuadamente? Por ejemplo, lo que generalmente es una buena manera de lidiar con un proyecto con docenas de archivos de fuentes que son interdependientes entre sí.

¿Hay algún marco para hacer que la creación de archivos BUILD o la gestión de todas estas compilaciones repetitivas sea más llevadera?

+0

¿En qué plataforma estás? ¿Qué quieres decir con archivos BUILD? ¿Quiere decir archivos de implementación (donde van las definiciones de funciones) o el archivo que el compilador lee para los modificadores, incluye las rutas de las bibliotecas y esas cosas? – dirkgently

+1

¿Es esto lo que encuentras difícil? g ++ -c unit1.c -I/include_path/ ; g ++ -o ejecutable * .o -L/library_path/ – LatinSuD

+0

¿Qué son los archivos de compilación? Y a qué se refiere con "en qué orden deben incluirse las clases me da dolor de cabeza". compilar archivos, o incluye en la h/cpp? –

Respuesta

8

CMake es el mejor sistema de compilación que he podido encontrar hasta ahora. Le da una lista de sus archivos de origen y escanea automáticamente las dependencias y recompila solo los archivos modificados. Aunque su sintaxis es un poco graciosa, y la documentación no es muy accesible, CMake supera las herramientas automáticas de GNU en usabilidad y simplicidad, y funciona en todas las plataformas principales.

En cuanto a su "modelo mental" de lo que está pasando, estos son algunos puntos a tener en cuenta.

  • Un archivo .cpp se compila de forma completamente independiente de otros .cpp archivos.

  • El compilador lee el archivo .cpp de arriba a abajo, solo una vez. Por lo tanto, las cosas deben estar en el orden correcto.

  • Una directiva #include es lo mismo que copiar/pegar el encabezado en el archivo .cpp.

  • En el punto donde se utiliza una función, una declaración de esa función es necesaria, pero no necesariamente una definición .

  • En el punto donde se accede a un miembro de la clase, se necesita una definición de la clase. Derivar de una clase también requiere su definición. Tomar punteros o referencias no requiere una definición, pero requiere una declaración . Use esto para su ventaja en los encabezados: en lugar de incluir Foo.hpp, vea si puede salirse con la sola declaración de class Foo;.

  • Al compilar un archivo .cpp, se genera un archivo .o que contiene la implementación de exactamente aquellas funciones definidas en el .cpp. Las referencias a funciones no definidas en el mismo quedan para que el enlazador las resuelva.

  • El enlazador agrupa todas estas definiciones en un archivo ejecutable, pero cada definición de función tiene que estar presente exactamente una vez. (Plantillas y funciones en línea son una excepción.)

1

Soy un gran fan de podcast de stackoverflow y yo hemos decidido que cuando me gustaría utilizar un sistema de construcción que debe utilizar FinalBuilder.

Jeff Atwood y Joel Spolsky tuvieron una conversación al respecto y se menciona que se usa en Fog Creek.

El podcast es here

FinalBuilder es here

Feature Tour

espero que sea adecuado para el propósito.

Funciona en la plataforma de Windows.

Cuestiones relacionadas