2011-06-14 11 views
8

Tengo muchos archivos fuente en el directorio de fuentes. Por ejemplo a.c, b.c, c.c y quiere compilarlo por gcc con la opción -combine.Combinación de Cmake y gcc

set(CMAKE_C_FLAGS "-combine") 
set(SRC a.c b.c c.c) 
add_executable(a.out ${SRC}) 

Cmake compila cada archivo * .c en el archivo de objeto, pero quiero recopilar todas las fuentes a un objeto. Cómo puedo conseguir esto.

En términos de gcc:

gcc -combine a.c b.c c.c -o module.o 
ar rcs library.a module.o 

Pero cmake utiliza la traducción por cada módulo de fuentes.

gcc a.c -o a.o 
gcc b.c -o b.o 
gcc c.c -o c.o 
ar rcs library.a a.o b.o c.o 

La traducción con la combinación podría acelerar el rendimiento del programa. No pude usar LTO, que podría resolver el mismo problema en cmake debido a la versión anterior de gcc.

Gracias.

+0

¿Estás seguro de que existe una opción '-combine'? Tengo la sensación de que eso no es lo que intentas hacer. Tal vez te refieres a '-fwhole-programme ', que es moralmente equivalente a concatenar todos tus archivos fuente juntos. Pero es más probable que solo intentes hacer una biblioteca reutilizable. Use '-shared' para hacer una biblioteca dinámica, o simplemente use el programa' ar' para combinar muchos archivos '.o' en una biblioteca estática. CMake puede automatizar ambos para usted. –

+2

Sí, estoy seguro. Esta opción existe en la versión de gcc 4.4/4.5 –

+0

¡Interesante, desapareció en 4.6! :-) ¿Cuál es su propósito? ¿Algo que no puedas lograr con '-fwhole-programme'? –

Respuesta

1

Use add_custom_target/add_custom_command.

En cualquier modo, es la construcción no portátil, por lo que aquí simple ejemplo

[raíz del proyecto] con dos carpetas en él [fuente] - aquí N archivos, [construir] para binario y CMakeLists.txt

cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR) 
set(TARGET_NAME whole) 
project(${TARGET_NAME} C) 

file(GLOB SRC_FILES src/*.c) 

add_custom_target(${TARGET_NAME} ${CMAKE_C_COMPILER} -flto -fwhole-program ${SRC_FILES} -o ${TARGET_NAME}) 

En la carpeta de compilación ejecute cmake ...; make VERBOSE = 1 entero

Esto hará que el trabajo sea para usted.

Pero, el programa completo solo funciona con ejecutable, según documentation.

-fwhole-program Supongamos que la unidad de compilación actual representa el programa completo que se está compilando. Todas las funciones y variables públicas, con la excepción de main y las fusionadas por atributo externally_visible, se convierten en funciones estáticas y, de hecho, se optimizan de forma más agresiva mediante optimizadores interprocedimientos.

Por lo tanto, el mástil tiene definido principal en cualquier lugar en sus archivos de origen.