2010-03-11 22 views
17

¿Cómo puedo obtener Eclipse para compilar muchos archivos binarios a la vez dentro de un proyecto (sin escribir un Makefile a mano)?Creación de varios archivos binarios dentro de un proyecto de Eclipse

Tengo un proyecto CGI que da como resultado múltiples programas .cgi para ser ejecutados por el servidor web, además de varias bibliotecas utilizadas por ellos. El Makefile hecho a mano utilizado para construirlo se vuelve poco sostenible. Usamos la "compilación interna" de Eclipse para compilar todos los demás proyectos y preferimos usarlo aquí también, pero por el bien de mí, no puedo encontrar cómo hacer que Eclipse construya múltiples programas pequeños como resultado en lugar de vincular todo en un binario

+1

Debería considerar hacer una pregunta por separado sobre cómo hacer que su Makefile sea más fácil de mantener, en caso de que este sea un callejón sin salida –

+0

En segundo lugar, el pensamiento expresado por Zac. ¿Por qué tu Makefile no se puede mantener? Muchos, muchos proyectos de software grandes y complicados usan makefiles con bastante éxito en bases de código que cambian rápidamente. –

Respuesta

21

Solución para esto descrito allí: http://tinyguides.blogspot.ru/2013/04/multiple-binaries-in-single-eclipse-cdt.html. No es un extracto:

  1. Crear un proyecto gestionado (Archivo> Proyecto ++ Nueva C> Ejecutable)
  2. Agregue el código fuente que contiene múltiples main() funciona
  3. Ir al proyecto> Propiedades> C/C++ General> Ruta & Símbolos> Gestionar configuraciones
  4. Realice una configuración de compilación para cada ejecutable y asígnele un nombre adecuado (puede clonar configuraciones existentes como Depurar y Liberar).
  5. desde el explorador de proyecto, haga clic en cada archivo de origen que contiene una función main()> Configuraciones de recursos> Excluir de la construcción y no incluyen todos crear configuraciones excepto el que se basa el ejecutable con esta función main()
  6. Todos otro código está incluido en todas las configuraciones de compilación de forma predeterminada. Es posible que deba cambiar esto dependiendo de su aplicación.
  7. Ahora puede crear un archivo ejecutable para cada función principal yendo a Project> Build Configuraciones> Set Active Proyecto> Generar proyecto
+3

o compilarlos todos de una vez a través de 'Proyecto> Configuraciones de compilación> Compilar todo' –

6

Usar Eclipse como su sistema de compilación para el código de producción parece una mala idea en general. Creo que es un gran IDE y lo he usado extensamente para proyectos de Java y C++, pero para un sistema de compilación, creo firmemente que Ant, make y otras utilidades de compilación dedicadas son el camino a seguir.

Hay varias razones para esto:

  • utilidades de compilación, ofrece la misma flexibilidad que busca en la generación de múltiples objetivos ejecutables.

  • Ant y hacer compatibles cadenas de proceso de compilación arbitrarias más concebibles (aunque no del todo).

  • Es probable que una utilidad de construcción dedicada ofrezca una mayor estabilidad y compatibilidad con versiones anteriores para los formatos de archivo de descripción de compilación que una herramienta IDE como Eclipse. Además, estoy bastante seguro de que la característica de compilación interna de Eclipse depende de la descripción del archivo ".project", y el formato de este último probablemente no sea tan estable como el formato de descripción de compilación para Ant o make.

  • de propósito general, los servicios básicos de construcción son generalmente comandar-basado en línea, lo que hace que sea fácil de integrar con más sofisticados, de alto nivel construir utilidades para la gestión de construcción automatizado como el pulso, climatizador, etc.

La necesidad que está motivando su pregunta es decirle que es hora de cambiar a una herramienta de construcción mejor.

2

Hay una manera de utilizar s para crear una biblioteca binaria (o compartido , en mi caso) de cada configuración de compilación. Usando la respuesta anterior, esto significa excluir manualmente todos menos el archivo principal efectivo de cada configuración de compilación.

Acabo de utilizar las respuestas anteriores para facilitar el trabajo en mi proyecto que crea 14 bibliotecas compartidas a través de 14 configuraciones de compilación. Sin embargo, la configuración de la indivdual "excluir de la acumulación" escenario era bastante engorroso, por lo que pasó a utilizar el siguiente código de depender de un como mi principal archivo completo:

/* 
*main.cpp 
*/ 
/* Within 
* Project | Properties | C/C++-Build | Settings 
* | GCC C++ Compiler | Preprocessor 
* set the following defined Symbol: 
* _FILENAME=${ConfigName} 
*/ 
#define __QUOT2__(x) #x 
#define __QUOT1__(x) __QUOT2__(x) 
#include __QUOT1__(_FILENAME.cpp) 
#undef __QUOT1__ 
#undef __QUOT2__ 
/* The above include directive will include the file ${CfgName}.cpp, 
* wherein ${CfgName} is the name of the build configuration currently 
* active in the project. 
* 
* When right clicking in 
* Project Tree | (Project) 
* and selecting 
* Build Configuration | Build all 
* this file will include the corresponding .cpp file named after the 
* build config and thereby effectively take that file as a main file. 
* 
* Remember to exclude ALL ${CfgName}.cpp files from ALL build configurations. 
*/ 

Tenga en cuenta que no hace nada más, entonces incluir otro. archivo cpp cuyo nombre se deduce del y un símbolo que se establece en las opciones del compilador. El símbolo es $ {CfgName} y será reemplazado por el nombre de la configuración actual por eclipse automáticamente.

No es necesario configurar, qué archivo se incluye en qué configuración de compilación. Solo excluya todos los archivos $ {CfgName} .cpp en cada compilación e incluya main.cpp en cada compilación.

PD: la respuesta de hovercraft me dio la idea de tener un archivo principal que no contenga código por sí mismo. Si uno incluye código compartido de los diferentes archivos principales efectivos $ {CfgName} .cpp, trabajar en su código puede volverse inviable porque los archivos de encabezado en main.cpp no ​​serán visibles en ellos. Hice esto hasta ayer, pero mantener el código con índices rotos, etc. fue un gran dolor.

PPS: este procedimiento actualmente rompe la reconstrucción automática del archivo principal si solo se cambió el archivo .cpp incluido. Parece que Eclipse no reconoce los cambios en $ {CfgName} .cpp (que está excluido de la compilación). Por lo tanto, se requiere una reconstrucción manual después de cada cambio. Esto me está molestando actualmente;)

Cuestiones relacionadas