Cmake и GCC объединяются - PullRequest
8 голосов
/ 14 июня 2011

У меня много исходных файлов в исходной директории. Например, a.c, b.c, c.c и вы хотите скомпилировать его с помощью gcc с опцией -combine.

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

Cmake компилирует каждый файл * .c в объектном файле, но я хочу скомпилировать все источники в один объект. Как я могу получить это.

В пересчете на gcc:

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

Но cmake использует перевод модулей для каждого модуля.

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

Перевод с комбайном может ускорить выполнение программы. Я не мог использовать LTO, который мог бы решить ту же проблему в cmake из-за старой версии gcc.

Спасибо.

1 Ответ

1 голос
/ 16 ноября 2011

Используйте add_custom_target / add_custom_command.

В любом случае это непереносимая конструкция, поэтому вот простой пример

[root проекта] с двумя папками в нем [src] - здесь N файлов, [build] для двоичного файла и 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})

В папке сборки запустите cmake ..; сделать VERBOSE = 1 целое

Это сделает работу за вас.

Но, -fwhole-программа работает только с исполняемым файлом, согласно документации .

-fwhole-программа Предположим, что текущий модуль компиляции представляет всю компилируемую программу. Все общедоступные функции и переменные, за исключением основных и тех, которые объединены атрибутом externally_visible, становятся статическими функциями и по сути оптимизируются более агрессивно с помощью межпроцедурных оптимизаторов.

Итак, вы должны определить main в любом месте ваших исходных файлов.

...