2009-09-07 16 views
16

Tengo un archivo CMakeLists.txt que tiene este aspecto:¿Cómo construir archivos de objetos solo una vez con cmake?

add_executable(exec1 exec1.c source1.c source2.c source3.c) 
add_executable(exec2 exec2.c source1.c source2.c source3.c) 
add_executable(exec3 exec3.c source1.c source2.c source3.c) 

El source1.o source2.o source3.o archivos toman un tiempo muy largo para construir, y puesto que son comunes a todos los ejecutables, Quiero que cada uno de ellos se construya solo una vez. El comportamiento actual de cmake, sin embargo, es reconstruirlos para cada objetivo de ejecución por separado, lo que es una duplicación innecesaria de esfuerzo.

¿Hay alguna manera de decirle a cmake que cree archivos de objeto solo una vez?

Respuesta

15

No. Esto sería difícil de lograr ya que los archivos de origen podrían ser compilados con diferentes opciones de compilación, después de la construcción de pasos, etc.

Lo que puede hacer es poner los archivos de objetos en una biblioteca estática y enlazar con que en lugar:

add_library(mylib STATIC source1.c source2.c) 
add_executable(myexe source3.c) 
target_link_libraries(myexe mylib) 

EDIT: por supuesto, se puede poner en un compartían biblioteca también.

+3

Tenga cuidado con ese enfoque. Las bibliotecas compartidas pueden ser más amigables si hay muchas personas involucradas http://blog.flameeyes.eu/2008/01/21/what-to-do-with-shared-code – richq

+2

Sí, por supuesto. Creo que simplemente asumí que el OP quería duplicar el código en cada uno de los ejecutables. – JesperE

12

Sí, en CMake 2.8.8 puede usar una biblioteca de objetos, que es un tipo de biblioteca virtual que tiene las mismas propiedades organizativas y de dependencia de una biblioteca real estática o compartida, pero no produce un archivo en el disco. Consulte los tutoriales de CMake: Object Library.

Cuestiones relacionadas