지금 우리는 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를 또한 필요로 할 것이다
댓글