본문 바로가기
기타/CMake

타겟

by 이재만박사 2016. 6. 17.

지금 우리는 CMaake의 전체 과정을 논의했고, cmMakefile 객체에 저장된 핵심 아이템의 일부를 고려하자

아마도 가장 중요한 아이템은 타겟이다

타겟은 실행 가능한, 라이브러리, 그리고 CMake에 의해 만들어진 유틸리티를 나타낸다

모든 add_library, add_executable, 그리고 add_custom_target 명령어는 타겟을 생성한다

예를 들어, 다음 명령어는 소스 파일로 foo1.c와 foo2.c 를 가진 static 라이브러리인 foo 라는 이름을 가진 타겟을 생성한다


add_library (foo STATIC foo1.c foo2.c)


foo 라는 이름은 프로젝트에서 그 밖의 모든 곳에 라이브러리 이름으로 사용할 수 있고, CMake는 필요할 때 라이브러리로 이름을 확장하는 방법을 알 것이다

라이브러리는 STATIC, SHARED, MODULE, 또는 선언되지 않은 것과 같은 특별한 타입이 되도록 선언할 수 있다

STATIC 은 라이브러리가 static 라이브러리로 빌드되어야 한다는 것을 가리킨다

마찬가지로 SHARED는 shared 라이브러리로 빌드되어야 한다는 것을 가리킨다

MODULE은 동적으로 실행할 때 로딩이 될 수 있도록 라이브러리가 생성되어야 한다는 것을 가리킨다

많은 운영체제에서 이것은 SHARED와 같지만 Mac OS X와 같은 다른 시스템에서는 다르다

만약 이 옵션들 중 아무것도 지정되지 않는다면 이것은 shared 또는 static 으로 라이브러리가 빌드될 수 있다는 것을 가리킨다

이 경우에 CMake는 라이브러리가 SHARED인지 STATIC인지 결정하기 위해 BUILD_SHARED_LIBS 변수의 설정을 사용한다

만약 설정이 되어있지 않다면, CMake는 static 라이브러리 빌드를 디폴트로 한다


마찬가지로 실행파일은 일부 옵션을 가진다

디폴트로 실행 파일은 main을 갖는 전통적인 콘솔 응용프로그램이 될 것이다

만약 WIN32가 실행 파일 이름으로 지정된다면 실행파일은 MS Windows 실행파일로 컴파일 될 것이고 운영 체제는 시작으로 main 대신에 WinMain을 호출할 것이다

WIN32는 Windows 체제가 아닌 것에서는 효과가 없다


그것들의 타입을 저장하는 것에 추가하여, 타겟은 또한 일반적인 속성을 추척한다

이 속성은 설정될 수 있고, set_target_properties와 get_target_property 명령어 또는 더 일반적인 set_property와 get_property 명령어를 사용하여 검색할 수 있다

가장 공통적으로 사용되는 속성은 LINK_FLAGS 인데, 이것은 구체적인 타겟을 위해 링크 플래그를 지정하는데 사용된다

타겟은 target_link_libraries 명령어를 사용하여 설정된 것에 대한 링크를 하는 라이브러리의 리스트를 저장한다

이 명령어로 전달된 이름은 라이브러리, 라이브러리에 대한 완전 경로, 또는 add_library 명령어로부터의 라이브러리 이름이 될 수 있다

그것들은 또한 링크할 때 사용하기 위한 링크 디렉토리, 타겟을 위한 설치 위치, 그리고 링크 후에 실행할 사용자 명령어를 저장한다


CMake가 생성하는 각 라이브러리에 대해, 라이브러리가 의존하는 모든 라이브러리들을 추적한다

static 라이브러리는 그것들이 의존하는 라이브러리에 링크를 하지 않기 때문에 CMake가 라이브러리를 추적하는 것은 중요하다 그래서 그것들은 생성되는 실행 파일의 링크 선을 지정될 수 있다

예를 들면, 


add_library (foo foo.cxx)

target_link_libraries (foo bar)


add_executable (foobar foobar.cxx)

target_link_libraries (foobar foo)


이것은 라이브러리 foo와 bar 를 실행파일 foobar에 링크할 것이고 오직 foo 만이 foobar로 명시적으로 링크한다

shared 또는 DLL 빌드를 하면서 이 링킹은 항상 필수적인 것이 아니라 추가 링크는 해롭다

static 빌드에 대해 이것은 필수적이다

왜냐하면 foo 라이브러리는 bar 라이브러리로부터 심볼을 사용하기 때문에, foobar는 그것이 foo를 사용하기 때문에 bar를 또한 필요로 할 것이다







댓글