CMake는 C++을 비롯한 다양한 언어의 빌드 시스템을 관리하기 위한 도구로, 빌드 과정에서 필요한 컴파일러와 링커의 옵션을 설정할 수 있다. 이 문서에서는 CMakeLists.txt 파일에서 링커 옵션을 설정하는 방법을 단계적으로 설명한다.

링커 옵션의 개념

링커(Linker)는 컴파일된 오브젝트 파일들을 결합하여 실행 가능한 프로그램이나 라이브러리를 생성하는 도구이다. 링커 옵션은 이 과정에서 링커에게 특정한 작업을 지시하는 명령어들이다. CMake에서는 이러한 링커 옵션을 설정하여 프로그램의 최적화, 라이브러리 연결, 디버깅 등의 작업을 제어할 수 있다.

CMake에서의 링커 옵션 설정 방법

CMake에서 링커 옵션을 설정하는 주요 방법은 다음과 같다:

target_link_libraries 명령어는 특정 타겟에 대해 필요한 라이브러리를 연결할 때 사용된다. 이 명령어를 통해 타겟에 대해 추가적인 링크 옵션을 지정할 수도 있다.

target_link_libraries(MyTarget PUBLIC -lm)

위 코드에서 MyTarget이라는 타겟에 대해 -lm 옵션을 사용하여 수학 라이브러리를 링크하도록 설정 하였다.

set_target_properties 명령어

set_target_properties 명령어를 사용하여 타겟의 속성을 설정할 수 있다. 이 명령어로 링커 옵션을 포함한 여러 속성을 조정할 수 있다.

set_target_properties(MyTarget PROPERTIES LINK_FLAGS "-Wl,-rpath,/usr/local/lib")

위 코드에서는 MyTarget 타겟에 대해 -Wl,-rpath,/usr/local/lib 옵션을 설정하여 실행 시 라이브러리 검색 경로를 지정 하였다.

add_link_options 명령어는 전체 빌드 과정에 적용할 글로벌 링커 옵션을 추가할 때 사용된다. 이 옵션은 프로젝트의 모든 타겟에 적용된다.

add_link_options("-Wl,--no-as-needed")

위 예제에서는 --no-as-needed 옵션을 추가하여 모든 타겟에 대해 불필요한 라이브러리도 링크에 포함되도록 설정 하였다.

CMake 3.13 버전 이후로, target_link_options 명령어를 통해 특정 타겟에 대해 링커 옵션을 직접 설정할 수 있다.

target_link_options(MyTarget PRIVATE "-Wl,-O1")

위 코드에서는 MyTarget 타겟에 대해 -O1 최적화 옵션을 적용 하였다. PRIVATE, PUBLIC, INTERFACE 키워드를 통해 옵션의 적용 범위를 지정할 수 있다.

조건부 링커 옵션 설정

특정 조건에 따라 링커 옵션을 설정하는 방법도 가능한다. 예를 들어, 디버그 모드와 릴리즈 모드에 따라 다른 옵션을 적용할 수 있다.

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    target_link_options(MyTarget PRIVATE "-Wl,-O0")
else()
    target_link_options(MyTarget PRIVATE "-Wl,-O3")
endif()

위 코드에서는 디버그 모드에서 -O0 옵션을, 릴리즈 모드에서는 -O3 옵션을 설정하도록 했다.

플랫폼별 링커 옵션 설정

다른 플랫폼에서는 각기 다른 링커 옵션을 필요로 할 수 있다. CMake에서는 플랫폼을 감지하여 적절한 옵션을 설정할 수 있다.

if(APPLE)
    target_link_options(MyTarget PRIVATE "-Wl,-headerpad_max_install_names")
elseif(UNIX)
    target_link_options(MyTarget PRIVATE "-Wl,--export-dynamic")
endif()

위 예제에서는 macOS와 UNIX 시스템에 대해 각기 다른 링커 옵션을 적용하고 있다.


관련 자료: - CMake 공식 문서: target_link_libraries - CMake 공식 문서: set_target_properties - CMake 공식 문서: add_link_options - CMake 공식 문서: target_link_options