2011-06-14 7 views
8

소스 파일에 많은 소스 파일이 있습니다. 예를 들어 a.c, b.c, c.c 그리고 -combine 옵션으로 gcc로 컴파일하려고합니다.Cmake와 gcc가 결합합니다.

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 

결합으로 번역하면 프로그램 성능이 향상 될 수 있습니다. gcc의 이전 버전 때문에 cmake에서 같은 문제를 해결할 수있는 LTO를 사용할 수 없습니다.

감사합니다.

+0

'-combine' 옵션이 존재합니까? 나는 당신이하려고하는 것이 아니라는 느낌을 가지고 있습니다. 어쩌면'-fwhole-program'을 의미 할 것입니다. 이것은 도덕적으로 모든 소스 파일을 연결하는 것과 같습니다. 그러나 재사용 가능한 라이브러리를 만들려고 노력하는 것일 가능성이 더 큽니다. 동적 라이브러리를 만들기 위해'-shared'를 사용하거나'.o' 파일을 정적 라이브러리에 결합하기 위해'ar' 프로그램을 사용하십시오. CMake는 두 가지 모두를 자동화 할 수 있습니다. –

+2

예, 확실합니다. 이 옵션은 gcc 버전 4.4/4.5에 존재합니다. –

+0

흥미 롭다. 4.6에서 사라졌다. :-) 그 목적은 무엇입니까? '-fwhole-program'으로 얻을 수없는 것은 무엇입니까? –

답변

1

add_custom_target/add_custom_command를 사용하십시오. 그것은 [SRC] 두 폴더 그래서 여기가 아닌 휴대용 건설, 간단한 예를

[프로젝트 루트]를 어떤 방식으로

- 여기 N 파일은 실행 파일의 [건설], 및 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-program은 documentation과 같이 실행 파일에서만 작동합니다.

-fwhole-program 현재 컴파일 단위가 컴파일되는 전체 프로그램을 나타내는 것으로 가정합니다. main을 제외하고 모든 public 함수와 변수와 외부 적으로 visible 속성에 의해 병합 된 변수는 정적 함수가되고 사실상 프로 시저 간 옵티 마이저에 의해보다 적극적으로 최적화됩니다.

그래서 주성분은 원본 파일의 어느 곳에서나 정의되어 있습니다.

관련 문제