항상 최소 필수 버전을 지정하십시오. cmake
cmake_minimum_required(VERSION 3.9)
프로젝트를 선언해야합니다. cmake이 필수이며 편리 변수를 정의 것이라고 PROJECT_NAME, PROJECT_VERSION그리고 PROJECT_DESCRIPTION(3.9 cmake이 후자의 변수 필요로) :
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
새 라이브러리 대상을 선언하십시오. 의 사용을 피하십시오 file(GLOB ...). 이 기능은 컴파일 과정에 익숙하지 않습니다. 게으른 경우 다음의 복사-붙여 넣기 출력 ls -1 sources/*.cpp:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
VERSION속성 설정 (선택 사항이지만 좋은 습관 임) :
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
SOVERSION의 주요 수를 설정할 수도 있습니다 VERSION. 에 libmylib.so.1대한 심볼릭 링크가됩니다 libmylib.so.1.0.0.
set_target_properties(mylib PROPERTIES SOVERSION 1)
라이브러리의 공개 API를 선언하십시오. 이 API는 타사 응용 프로그램 용으로 설치됩니다. include/디렉토리를 배치하는 것과 같이 프로젝트 트리에서 격리하는 것이 좋습니다 . 개인 헤더는 설치하지 않아야하며 소스 파일과 함께 배치하는 것이 좋습니다.
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
하위 디렉토리로 작업하는 경우와 같은 상대 경로를 포함하는 것이 매우 편리하지 않습니다 "../include/mylib.h". 따라서 포함 된 디렉토리에서 최상위 디렉토리를 전달하십시오.
target_include_directories(mylib PRIVATE .)
또는
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
라이브러리의 설치 규칙을 작성하십시오. CMAKE_INSTALL_*DIR다음에 정의 된 변수를 사용하는 것이 좋습니다 GNUInstallDirs.
include(GNUInstallDirs)
설치할 파일을 선언하십시오.
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
pkg-config파일을 내보낼 수도 있습니다 . 이 파일을 사용하면 타사 응용 프로그램에서 라이브러리를 쉽게 가져올 수 있습니다.
이름이 지정된 템플릿 파일을 만듭니다 mylib.pc.in(자세한 내용은 pc (5) 맨 페이지 참조).
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@CMAKE_INSTALL_PREFIX@
libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@
Requires:
Libs: -L${libdir} -lmylib
Cflags: -I${includedir}
에서 매크로 CMakeLists.txt를 확장하는 규칙을 추가 하십시오 @( @ONLYcmake에게 형식의 변수를 확장하지 않도록 요청하십시오 ${VAR}).
configure_file(mylib.pc.in mylib.pc @ONLY)
마지막으로 생성 된 파일을 설치하십시오.
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
cmake EXPORT기능을 사용할 수도 있습니다 . 그러나이 기능은 호환되며 cmake사용하기가 어렵습니다.
마지막으로 전체 CMakeLists.txt가 다음과 같아야합니다.
cmake_minimum_required(VERSION 3.9)
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
include(GNUInstallDirs)
add_library(mylib SHARED src/mylib.c)
set_target_properties(mylib PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1
PUBLIC_HEADER api/mylib.h)
configure_file(mylib.pc.in mylib.pc @ONLY)
target_include_directories(mylib PRIVATE .)
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)