Consejos para reducir el tiempo de enlace de C++
linker (5)
Tengo un proyecto que toma alrededor de 8 segundos para enlazar con g ++ y ld.
Utiliza un montón de bibliotecas estáticas, la mayoría del código es c ++.
Estoy interesado en una lista general de consejos sobre cómo reducir el tiempo de enlace. Cualquier cosa desde "no incluir símbolos de depuración" hasta "hacer que su código sea menos espatético"
¿Qué hay de compilar las compilaciones de depuración como bibliotecas compartidas? Eso resolverá la saturación del símbolo de depuración, ya que las bibliotecas de importación son pequeñas con o sin información de depuración. Tal vez no sea la mejor solución, pero creo que esto reducirá sustancialmente el tiempo de enlace ...
8 segundos es bastante rápido , a menos que estés realmente seguro de que no debería demorar tanto. Tengo proyectos que tardan de 5 a 8 minutos en volver a vincularse por completo, ya que no realizamos enlaces incrementales en nuestras versiones de lanzamiento. ¿Has intentado usar enlaces incrementales (si no estás utilizando -shared
, puedes usar -i
o -r
)?
Desactive la optimización de todo el programa (al menos durante el desarrollo). Use p-impl para reducir dependencias.
Trate esto durante años en un trabajo anterior. El enlazador GNU simplemente tiene serios problemas de rendimiento al vincular grandes cantidades de bibliotecas estáticas. En un momento dado, el tiempo de enlace estaba a la par con el tiempo de compilación, que nos pareció tan extraño que en realidad investigamos esto y lo descubrimos.
Puede intentar fusionar sus bibliotecas estáticas en un "superobjeto" antes de vincular. En lugar de vincular así:
$ g++ -o program program.o $STATIC_LIBS
Puedes intentar esto:
$ ld -r -o libraries.o --whole-archive $STATIC_LIBS
$ g++ -o program program.o libraries.o
Tenga en cuenta que este método le da al vinculador menos oportunidad de excluir el código objeto no utilizado, por lo que sus binarios pueden aumentar de alguna forma.
crea un ramdisk, compila y vincula al disco duro.
ya que está usando muchas librerías estáticas, puede crear una biblioteca gigante que contenga todas estas bibliotecas para que termine con una biblioteca. elimine todas las bibliotecas de su lib-list y agregue el gigante. Esto reduce las aperturas de archivo a 1 para las bibliotecas y puede acelerar las acciones de lectura.