¿Gestión de dependencias similar a Maven para C ++? [cerrado]


94

Digamos que tengo un proyecto de C ++ que se divide en varios subproyectos. Todos los subproyectos producen una DLL y diferentes equipos de desarrolladores trabajan en cada uno de los subproyectos. Ahora bien, si quiero construir el proyecto principal, ¿hay alguna manera de evitar tener que construir todos los subproyectos por mí mismo?

En resumen, estoy buscando algo que haga la gestión de dependencias (es decir, para archivos binarios y encabezados) de manera similar a como lo hace Maven para Java.

De hecho, traté de usar Maven para esto, pero esto es bastante engorroso porque tengo que crear los paquetes manualmente y con bastante frecuencia, Maven no capta los cambios más recientes. Además, ejecutar la compilación es un poco complicado, ya que tengo que llamar a NAnt desde Maven (uso la función de NAnt para crear soluciones de Visual Studio directamente).

¿Alguna sugerencia e idea de cómo hacer esto?


El problema al usar make es que tengo que compilar todo al menos una vez y, por lo tanto, también necesito los archivos fuente para las dependencias. Especialmente, al reconstruir bibliotecas dependientes, puede llevar mucho tiempo y afectar gravemente la productividad. ¿O me estoy perdiendo algo?
weberste

3
Esta parece una pregunta útil. ¿Quizás esta pregunta pueda trasladarse a otro sitio que sea más receptivo a estas preguntas? Estoy buscando las mejores prácticas para la gestión de dependencias de C ++.
simgineer

Esto tiene un retraso de unos 10 años, por lo que hay 3 posibilidades aquí: está haciendo un mal uso maven, se está perdiendo todo el punto maven, o hace 10 años, cuando no estaba usando mavenpara C ++, era mucho menos útil para C ++. No puedo hablar de 2009, pero en los últimos años, por experiencia, mavenes exactamente lo que usaría para el problema que está describiendo. Hace exactamente lo que quiere, y de manera bastante eficiente y bien, y no hace las cosas negativas que dice que hace. Cualquiera que lea esto en 2019 o después debería considerar seriamente usarlo mavenpara este propósito.
motor de búsqueda

Respuestas:


37

Respuesta inicial : Sugeriría usar CMake. Es un generador de archivos make multiplataforma (también genera proyectos de Visual Studio o Eclipse CDT).

http://www.cmake.org/

Tuve una muy buena experiencia con eso. Lo mejor que me gustó fue la capacidad de producir una estructura de proyecto genérica. Por lo tanto, puede incluir de forma genérica la búsqueda de subproyectos para pruebas unitarias, etc. sin cambiar el script cada vez.

También tienen muchos módulos sobre cómo encontrar bibliotecas de compilación preinstaladas, necesarias para el proyecto (como Boost, QT, etc.)


Actualización : Mientras tanto, se hicieron algunos esfuerzos para introducir la administración de paquetes para C ++. Algunos proyectos que vale la pena considerar:

  • conan.io se integra con las principales herramientas de construcción:
    • CMake
    • Estudio visual
    • Makefile
    • XCode
    • ...
  • cpm basado en CMake ( Nota tenga en CPM no se mantiene de forma activa).
  • Buckaroo

Tenga en cuenta que, como lo señaló @RAM en los comentarios, cpm ya no se mantiene activamente.


7
Usé CMake hace unos meses y, de hecho, la verificación de bibliotecas preinstaladas funcionó muy bien. Sin embargo, otras dependencias binarias (es decir, las que provienen de mis subproyectos) no se pudieron administrar fácilmente. ¿Me estoy perdiendo de algo?
weberste

3
@weberste, en realidad no existe una herramienta de maven para C / C ++. Los desarrolladores intentan manejar la gestión de dependencias con apt-get like tool.
SunnyShah

1
cpm no se mantiene activamente y ha estado muerto desde principios de 2015.
RAM

@RAM: gracias por señalar eso. Agregué una nota en la publicación con referencia a usted.
ovanes

2
CMake es un sistema de compilación con capacidad limitada para encontrar dependencias. No es un administrador de la dependencia en el sentido de la NGP, carga, etc.
sdgfsdh

17

Para la gestión de dependencias existe un nuevo proyecto (es una startup) que está implementando este tipo de herramienta: https://github.com/biicode (un gestor de dependencias C ++). Puede agregar sus dependencias y debería funcionar.

Actualmente, el nombre del proyecto es conan.io , fueron adquiridos por JFrog .

ACTUALIZACIÓN: El proyecto está muerto ... Desafortunadamente, parece que la startup no pudo obtener suficientes clientes de pago premium, pero el servidor parece estar funcionando bien ...

ACTUALIZACIÓN2: Parece que hay un proyecto sustituto: conan.io (gracias @mucaho)


Puedo quitar el enlace .. el proyecto se cerró, ahora es conan.io
carlos.baez

¡Gracias por la actualización! La mayoría de las veces estoy mirando por curiosidad, parece que todavía es posible hurgar en su github para obtener la documentación ; Probablemente no sea tan bueno como lo que estaba en el sitio web en un momento, pero supongo que es mejor que nada. Me pregunto si conan.io es solo un cambio de marca o es un producto totalmente diferente.
jrh

1
No es un cambio de marca, sino un proyecto completamente nuevo desde cero con todas las lecciones aprendidas: completamente de código abierto, completamente descentralizado con un servidor interno, admite todos los sistemas de compilación, administra binarios.
drodri

8

Recomiendo los siguientes sistemas de compilación de alto nivel:


El complemento Maven Nar está recibiendo un buen soporte. Lo usé y me gusta hasta ahora. Sin embargo, debe comprender que Maven no es bueno para un repositorio mono. La mayoría de las soluciones C ++ necesitan un repositorio Mono que maneje bibliotecas compartidas y demás.
Hans

5

Si solo desea la administración de dependencias, pruebe Ivy , se integra muy bien con Ant (y supongo que NAnt puede hacer lo mismo en base a este blog , que está vinculado desde el sitio de Ivy).

También existe Byldan , una versión .Net de Maven. Sin embargo, no sé qué tan bien funcionará para usted.


3

Make y GCC son una gran combinación para una comprobación de dependencias realmente buena.

GCC puede generar archivos de dependencia 'make' automáticamente (cambio de línea de comandos -MD), para poder reconstruir todos los archivos fuente que dependen de un encabezado dado, por ejemplo.

Tengo algunas reglas simples que corto y pego en mis archivos MAKE:

# compile c files   
%.o:    %.c
    ${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@

# compile c++ files
%.opp:  %.cpp
    ${CPP} ${CPPFLAGS} -c $< -MD -MF $(<:%.cpp=%.dep) -o $@

Ahora, si sus archivos de objeto se declaran en, digamos, una lista OBJ_C y OBJ_CPP:

.PHONY: cleandep
cleandep:
    rm -f $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

-include $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

Por supuesto, Make puede realizar un seguimiento de las dependencias con otros proyectos y similares, por ejemplo, también reconstruyendo una biblioteca compartida según sea necesario.

Por ejemplo, si sus otros equipos siempre colocan sus archivos DLL más recientes en alguna carpeta compartida:

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib
  ...

${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib
  cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib

ver mi comentario adjunto a la pregunta sobre mis preocupaciones con esta solución
weberste

Si un destino depende de otro archivo, por ejemplo, su ejecutable depende de una biblioteca compartida, puede tener una regla para esa biblioteca compartida que asegure que su copia de la biblioteca esté actualizada sin necesidad de la fuente, por ejemplo, simplemente obteniendo la última copia de una ubicación en particular o de ejecutar alguna actualización de control de versiones o similar.
Will el

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@Me costó analizar todos estos símbolos Make, parece que esto se resuelve en algo así como g++ -c main.cc -MD -MF testsi desea ejecutarlo de forma independiente en la línea de comando, y coloca los resultados en un archivo llamado 'prueba'.
jrh


2

Recomiendo Conan , que estaba usando estos días. Es muy poderoso mantener todas las bibliotecas y binarios dependientes en su proyecto.


1

Puede crear el paquete NuGet para las bibliotecas usadas y usar NuGet para la administración de dependencias.

Consulte también NuGet para C ++


1
NuGet es una extensión de Visual Studio
Toughy

@Toughy, también se puede utilizar como una gestión de dependencias independiente. (Archivo ejecutable 4M)
Yousha Aleayoub

0

Hay una serie de herramientas encima de SCons, que proporcionan una funcionalidad de nivel superior similar a la de Autotools, que intenta facilitar la vida de los desarrolladores (por ejemplo, WAF, SNOCS). Desafortunadamente, SCons en sí tiene el mayor inconveniente: mayor tiempo de compilación para los proyectos grandes.

Puedo recomendar probar SNOCS (que es un SCons invertido) para aquellos de ustedes que buscan una gestión de dependencias fácil y eligen opciones de compilación en el comando único (compilador, x86 / x64, Debug / Release, bibliotecas estáticas / compartidas, prueba / instalar destinos, etc.).

SNOCS también intenta abordar el problema del tiempo de compilación prolongado almacenando la salida de la configuración del proyecto en archivos separados, lo que permite que las compilaciones consiguientes omitan la fase de configuración por completo y vayan directamente a la fase de construcción (la última característica está en construcción ahora)

La configuración de CMake se vuelve tediosa en soluciones más grandes, por lo que el mantenimiento del sistema de compilación requiere una gran fracción del tiempo del desarrollador. Afortunadamente, como ya mencionó Martijn, existe un biicode que "usa CMake para generar su proyecto con sus dependencias".


-1

Tratar SCons

SCons es una herramienta de construcción de software de código abierto, es decir, una herramienta de construcción de próxima generación. Piense en SCons como un sustituto multiplataforma mejorado de la clásica utilidad Make con funcionalidad integrada similar a autoconf / automake y cachés de compiladores como ccache. En resumen, SCons es una forma más fácil, confiable y rápida de crear software.


3
SCons no tiene ningún repositorio o administración de dependencias integrado como se solicita.
Maxime Viargues

-3

Recomiendo usar la madre de todos los sistemas de dependencia de compilación: make.


Utilizo esto ampliamente. GCC puede crear archivos de dependencia que 'make' puede comer. Suficiente para otra respuesta, quizás ...
Will

8
make es en realidad lo que todo el mundo quiere evitar / reemplazar al observar los sistemas de automatización de compilación
automatización de chila

-6

Prueba los scons, te engancharán. Make está desactualizado, es difícil y costoso de mantener.


Eché un vistazo a Scons pero no encontré una forma de administrar las dependencias binarias. ¿Tiene un ejemplo para esto?
weberste

1
Dado que scons es python, puede codificar lo que quiera para administrar sus dependencias binarias con bastante facilidad. Quizás también ayude tener un "SConscript" en el directorio de sus dependencias binarias. No estoy seguro de cuáles son sus requisitos aquí. Pedro.
piotr

16
Por lo tanto, está sugiriendo una herramienta basada en "No estoy seguro de lo que necesita, pero puede programarlo usted mismo en Python". Entonces, ¿por qué necesitas scons?
jalf
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.